三层架构对于开发人员来说,已经是司空见惯了,除了大型与超小型项目外,大多都是这种架构来进行开发。

  在这里为初学者们简单介绍一下三层架构:

  (下面内容摘自《趣味理解:三层架构与养猪—《.NET深入体验与实战精要》》,这是以前看到的关于三层架构介绍,觉得挺经典的,大家有时间的话认真看看)

  

  对比以上两图,我们可以看出:
  1)数据库好比猪圈 ,所有的猪有序地按区域或编号,存放在不同的猪栏里。
  2)DAL 好比是屠宰场 ,把猪从猪圈取出来进行(处理)屠杀,按要求取出相应的部位(字段),或者进行归类整理(统计),形成整箱的猪肉(数据集),传送给食品加工厂( BLL )。本来这里都是同一伙人既管抓猪,又管杀猪的,后来觉得效率太低了,就让一部分人出来专管抓猪了( DBUtility ),根据要求来抓取指定的猪。
  3)BLL 好比食品加工厂 ,将猪肉深加工成各种可以食用的食品(业务处理)。
  4)Web 好比商场 ,将食品包装成漂亮的可以销售的产品,展现给顾客( UI 表现层)。
  5)猪肉好比 Model ,无论是哪个厂(层),各个环节传递的本质都是猪肉,猪肉贯穿整个过程。
  6)通用类库 Common 相当于工人使用的各种工具,为各个厂(层)提供诸如杀猪刀、绳子、剪刀、包装箱、工具车等共用的常用工具(类)。其实,每个部门本来是可以自己制作自己的工具的,但是那样会使效率比较低,而且也不专业,并且很多工作都会是重复的。因此,就专门有人开了这样的工厂来制作这些工具,提供给各个工厂,有了这样的分工,工厂就可以专心做自己的事情了。

  我们的框架结构

  接下来要和大家一起开发的是基于SubSonic3.0 ORM插件的框架,关于SubSonic3.0的具体介绍将会在下一章节详细说明。

  在此要向大家声明的是,本框架主要应用于中小型项目,对于并发量非常大、对性能要求非常高的和有完美倾向的开发人员(如开发中必须统一使用一种开发结构,要求三层架构必须使用面向对象的朋友),请拐弯,因为本框架可能不符合你的审美观。

  本框架不会完全使用面向对象的方式来进行开发,本框架追求的思想是合适与快捷。即在合适的地方使用适合的插件或技术,整个框架完成后添加新功能、做二次开发或维护时,能方便快捷(速度流)。

  比如该用存储过程实现的业务逻辑,就不用强制使用代码来实现,因为有些逻辑使用代码来实现,无论在开发时间、代码量、并发处理、性能上都与存储过程处理没法比;在需要使用ADO.NET来执行SQL语句时,就不会为了统一框架底层调用方法,强制使用SubSonic插件的相关方法来实现,如果你看到这种代码心理很不舒服的话,那只能说我们不在一个频道上,对于我这种实用型开发者来说,所追求的编程模式方向可能与你不同。

  下图是本框架的扩展结构发给大家参考一下,以后的章节重点讲解的是红框框住的几个项目,详细讲述本框架底层架构是怎么搭建的,指导初学者们一步步搭建好自己的框架架构。

  

  对比前面的三层架构,大家可能会很奇怪,怎么没有看到Model层的?这是因为我们使用的SubSonic3.0插件所附带的效果,该插件附带的T4模板所生成的Model与DAL混合在一起,很难进行分开。SubSonic插件为了实现更新数据的时候,自动将它所生成的SQL语句剔除掉未赋值字段,只更新已赋值的字段内容,而对实体类的Set进行了改造(如下图)。(注:常见的SQL语句生成框架是没有这种过滤功能)

  

  这样处理将会减少更新数据长度,减少对实体类字段赋值操作(对使用默认值的字段不用再进行赋值操作),减少代码工作量。例如:有些订单表里有几十个字段,其中大部分在创建时使用默认值就可以了,这时只需要对需要的几个字段赋值即可。

  框架各项目功能说明

序号 名称 说明
1 Solution.Common 公共函数类
2 SubSonic.Core SubSonic3.0.0.4插件源码
3 Solution.DataAccess 数据访问层
4 Solution.Logic.Managers 业务逻辑层
5 Solution.Web.Managers UI层(后台管理系统)

  各层之间调用说明
  1)    Solution.Commom,主要存放系统要调用到的各种常用工具函数,给其他所有层调用。
  2)    SubSonic.Core,SubSonic3.0插件源码,主要负责与数据库进行交互,将业务转换成相应的SQL语句,对数据库进行各种增、删、改、查等操作;
  3)    Solution.DataAccess,主要存放T4模版生成的业务实体(Model)、数据库表结构、业务实体常用函数、存储过程调用函数,以及已封装好的各种数据库操作函数和ADO.NET数据库执行函数;
  4)    Solution.Logic.Managers,主要存放各种业务逻辑函数,其中SubSonic文件夹里的文件是由T4模版自动生成的常用逻辑函数(会将UI层所要用到的80%以上的函数自动生成出来)。这些逻辑函数主要是接收UI层的操作命令与参数,进行逻辑运算和处理后,提交给Solution.DataAccess层来处理,以实现对数据库表记录的增、删、改、查等操作;
  5)    Solution.Web.Managers层是UI层,用来展示管理系统的各个页面与功能。主要实现和用户的交互,接收用户请求或展示用户请求的数据结果。

 版权声明:

  本文由AllEmpty原创并发布于博客园,欢迎转载,未经本人同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如有问题,可以通过1654937@qq.com 联系我,非常感谢。

  发表本编内容,只要主为了和大家共同学习共同进步,有兴趣的朋友可以加加Q群:327360708 或Email给我(1654937@qq.com),大家一起探讨。

  更多内容,敬请观注博客:http://www.cnblogs.com/EmptyFS/

从零开始编写自己的C#框架(5)——三层架构介绍的更多相关文章

  1. 从零开始编写自己的C#框架(1)——前言

    记得十五年前自学编程时,拿着C语言厚厚的书,想要上机都不知道要用什么编译器来执行书中的例子.十二年前在大学自学ASP时,由于身边没有一位同学和朋友学习这种语言,也只能整天混在图收馆里拼命的啃书.而再后 ...

  2. 从零开始编写自己的C#框架 ---- 系列文章

    目录: 从零开始编写自己的C#框架(1)——前言从零开始编写自己的C#框架(2)——开发前的准备工作从零开始编写自己的C#框架(3)——开发规范从零开始编写自己的C#框架(4)——文档编写说明从零开始 ...

  3. [转帖] 从零开始编写自己的C#框架(27)——什么是开发框架

    从零开始编写自己的C#框架(27)——什么是开发框架 http://www.cnblogs.com/EmptyFS/p/4105713.html 没写过代码 一直不清楚 框架的含义 不过看了一遍 也没 ...

  4. 从零开始编写自己的C#框架(26)——小结

    一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...

  5. 从零开始编写自己的C#框架(25)——网站部署

    导航 1.关掉访问保护 2.发布网站 3.复制网站到服务器 4.添加新网站 5.设置网站访问权限 6.设置文件夹访问权限 7.控制可更新文件夹执行权限 8.设置“应用程序池”.net版本与模式 9.附 ...

  6. 从零开始编写自己的C#框架(20)——框架异常处理及日志记录

    最近很忙,杂事也多,所以开发本框架也是断断续续的,终于在前两天将前面设定的功能都基本完成了,剩下一些小功能遗漏的以后发现再补上.接下来的章节主要都是讲解在本框架的基础上进行开发的小巧. 本框架主要有四 ...

  7. 从零开始编写自己的C#框架(17)——Web层后端首页

    后端首页是管理员登陆后进入的第一个页面,主要是显示当前登陆用户信息.在线人数.菜单树列表.相关功能按键和系统介绍.让管理员能更方便的找到息想要的内容. 根据不同系统的需要,首页会显示不同的内容,比如显 ...

  8. 从零开始编写自己的C#框架(15)——Web层后端登陆功能

    对于一个后端管理系统,最重要内容之一的就是登陆页了,无论是安全验证.用户在线记录.相关日志记录.单用户或多用户使用帐号控制等,都是在这个页面进行处理的. 1.在解决方案中创建一个Web项目,并将它设置 ...

  9. 从零开始编写自己的C#框架(11)——创建解决方案

    这段时间一直在充电,拜读了园子中大神们的博文(wayfarer的<设计之道>.TerryLee的<.NET设计模式系列文章>.卡奴达摩的<设计模式>还有其他一些零散 ...

随机推荐

  1. network issue troubleshooting

    Today we troubleshooting a lot of network issue by using commands like: ping <ip>/<computer ...

  2. weex append

    append有两个值:其中的一个是tree, 另外一个是node. 不会像数据绑定一样对最后的渲染结果有影响.但它决定是否会影响整个节点的重绘还是只是某一个地方的内容会重绘. append=" ...

  3. python列表副本

    a=[1,2,3] b=[4,5,6] a=a+b #创建含a和b的副本的新列表 a [1, 2, 3, 4, 5, 6] b [4, 5, 6] c=a+b #创建含a和b的副本的新列表c [1, ...

  4. ubuntu 16.04 Dockerfile 安装mysql

    默认上MariaDB的包并没有在Ubuntu仓库中.要安装MariaDB,我们首先要设置MariaDB仓库. 配置MariaDB 仓库 # apt-get install software-prope ...

  5. codeforces 360 D - Remainders Game

    D - Remainders Game Description Today Pari and Arya are playing a game called Remainders. Pari choos ...

  6. WCF 程序入门

    WCF是微软公司推出的符合SOA思想的分布式应用程序技术框架和编程模型,是建立在消息通信这一概念基础上运行的一个运行时服务系统. WCF编程模型的目标是实现以下两个实体之间的通信:WCF服务端和WCF ...

  7. c = (a / b, a%b) 运算输出顺序

    #include<iostream> int main() { using namespace std; int a, b, c; a = ; b = ; c = ; printf(&qu ...

  8. 使用JDBC调用存储过程

    DELIMITER $$ DROP PROCEDURE IF EXISTS `jdbc`.`addUser` $$ ),in birthday date,in money float,out pid ...

  9. 剑指offer编程题java实现(正在更新)

    面试题三:查找二维数组中元素问题 public static void main(String[] args){ int[][] num = {{1,2,8,9},{2,4,9,12},{4,7,10 ...

  10. 剑指Offer面试题:12.在O(1)时间删除链表结点

    一.题目:在O(1)时间删除链表结点 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 原文采用的是C/C++,这里采用C#,节点定义如下: public class ...