.NET简谈分层架构思想(彻底分离每个层)

提到分层,我就想起一句图灵奖获得者说过的话:计算机科学领域任何问题,都可以间接的通过添加一个中间层来解决;当初看到这句话的时候还不能深刻的体会到这句话的真正灵魂是什么。之所以要写这篇文章作为技术爱好者之一更愿意与大家分享技术给我们带来的快乐,本人将从另一个角度来解析.NET分层架构的真正奥秘。分层,一些技术功底比较薄弱的程序员听到分层就会联想到三层架构(BLL,DAL之类的),其实不是,分层是一个很大的技术框架思想,三层架构只不过是对普通的信息系统来说,将信息的流转通过三层来分解,在开发系统时一般总会在解决方案中新建一个Model层、一个BLL层、然后DAL层;其实如果是这样建项目的话跟一个解决方案中放上一个程序一样的只不过可以用文件夹分开建立文件是一回事;技术水品的不同对三层的理解各不相同,有时会加上一个接口层让每层依赖接口来实现,像上面的BLL、DAL之类的架构,只是人为的分解感觉解决方案看上去很清晰一幕了然,对框架来说没有什么分离作用,还是高耦合低类聚;

在分层架构中,是从总体上对系统进行一个分层,里面涉及纵横向的概念,一个大的系统从业务逻辑来讲可以不是单单的对信息的处理,也可能涉及到对一些其他的逻辑处理,这里就不能单单的把逻辑抽象到三层中,三层是横向分层中的一个层,如果对分层的焦距拉远点看是看不到三层的,如果把焦距拉近点看也许目标不会锁定在信息流的处理子层中,说起来比较抽象来个图吧;

上图中将一个大的系统分解为三个业务逻辑块其实也就是我所说的三个大的层面,我们将焦距拉近看业务逻辑1中的子层;

逻辑1这个大层被分解为两个子层BLL、和DAL,也就是我们常用的业务逻辑层和数据访问层;业务逻辑1层中主要是用来对数据库的增、删、改、查操作,将其抽象成BLL和DAL也是我们所熟悉的三层;在另外两个业务逻辑层中一样可以将其分解层多道子层;将子层分开后就要涉及到具体实现的问题了,就拿C#面向对象语言来将,架构跟思想都是一些方法论的东西,具体实现是少不了的;层是分好了是否在开发过程中真真做到层层隔离,不互相依赖,所以是用接口层分割开来,将具体的实现层脱离开来,我们将BLL层改为BLL接口层BLLI,将DAL层改为DAL接口层DALI,这样让BLL、DAL去实现BLLI和DALI接口,完全分离开发,这也是面向对象所提倡的面向接口编程而不是面向实现编程;

以后BLL层出现问题可以完全替换掉换另一个BLL层,DAL层同样也一样;但是这是思想性的东西落实到代码还没那么简单:

如:BLLI B=new BLL();//在通常情况下是这样去用接口的,但是似乎没有理论说的那么干净的分离,我们在通过添加一个工厂来实现分离;

这样在使用时:BLLI B=new BLLI工厂(BLLI接口类型);在调用工厂的时候将接口的类型做为参数传进去,在工厂中在通过接口类型去查找具体的实现对象;如:

        public static T GetInterfaceRealization<T>(Type interfacetype)
        {

            Assembly ass = Assembly.LoadFrom("程序集的名称");

            Type[] asstype = ass.GetTypes();
            if (asstype.Length <= 0)
                throw new Exception("接口管理器的异常:该程序集没有任何实现类");
            for (int i = 0; i < asstype.Length; i++)
            {
                //获取该实现类的整个继承链中是否有传入的接口类型;
                Type oddinterfacetype = asstype[i].GetInterface(interfacetype.Name);
                if (oddinterfacetype != null)
                {
                    T t = (T)System.Activator.CreateInstance(asstype[i]);
                    return t;//返回动态实例化的接口实现类;
                }
            }
            throw new Exception("接口管理器的异常:没有该接口的实现类,必须先实现接口类才能查找");
        }

 因为同一个解决方案中的不同项目彼此直接引用时,有利于项目的开发调试,但是我们的BLL和调用方是完全没有任何依赖的在程序调用时候没有任何类型的调用所以在解决方案生成的时候不会将我们引用的项目程序集拷贝到执行目录中,如果想省略手工操作可以在执行查找的时候先调用一下实现层的对象,这样当编译生成的时候代码检查到你有调用会将你调用的项目程序集拷贝到执行目录中,在通过接口工厂动态查找时不会失败;

这样就彻底的实现层层分离的规则;所谓思考是前进的本质,本人也是通过不断的思考总结出来的一点点小的经验与大家分享一下,如果有什么地方说的不对的地方请大家指出,谢谢;

时间: 2024-10-14 06:23:53

.NET简谈分层架构思想(彻底分离每个层)的相关文章

.NET简谈分层架构思想(彻底分离每个层)——后补

先给大家说声不好意思,在本人的".net简谈分层架构思想(彻底分离每个层)"文章中由于缺乏示例代码,所以给大家理解带来不便,小弟先赔礼:这篇文章我补充所有实现彻底分层的全部代码. 彻底分层的好处是能合理的分配各个人员的工作量,比如在我们某一个项目团队里面可能有的人偏向于UI设计开发,有的偏向于业务逻辑的编写,熟悉公司核心业务的人可以不需要管UI层和业务层的实现方式,只要实现数据访问层的代码,供上层调用:在本人的一个项目里面,为了能让所有的实现彻底分离开发是技术的要求也是业务的要求,项目

应用程序框架实战十三:DDD分层架构之我见(转)

前面介绍了应用程序框架的一个重要组成部分--公共操作类,并提供了一个数据类型转换公共操作类作为示例进行演示.下面准备介绍应用程序框架的另一个重要组成部分,即体系架构支持.你不一定要使用DDD这样的架构,使用单层架构和普通三层架构一样可以,不过你如果希望获得更进一步的复用性和封装度,使用更加面向对象的技术是必经之程. 我在2010年以前还在使用古老的ASP.NET WebForm和原始的Ado.Net.之前我有个观念:.NET技术发展太快,跟着微软屁股后面跑太累,所以只使用它一些原始的东西,自己封

WLAN产品形态之分层架构

随着移动互联网时代的来临,无线数据流量呈现爆发式增长,各大运营商也越来越多依靠WLAN来承载这些无线数据流量,大规模进行WLAN网络建设,分担3G网络的压力,让客户体验更加美好.无处不在的优质无线网络服务.百万规模的WLAN网络建设,对于网络架构提出了新的要求.针对上述需求,分层AC架构应运而生.一.WLAN产品架构背景介绍 随着无线网络的不断发展,WLAN产品构架形态的演变主要经历了三个时期. 1. Fat AP架构 Fat AP是传统的WLAN组网方案,AP本身承担了用户认证.漫游切换.用户

【1】JAVA---地址App小软件(AddressApp.class)(初步接触项目开发的分层思想)(表现层)

这个是表现层的main方法. 实现的地址信息有: 姓名,性别,年龄,电话,地址. 实现的功能有: 增加地址: 删除地址: 修改地址: 查找地址:其中年龄的查找为年龄段的查找. 数据存储的方式为文件存储和读写. 分层的思想是:表现层调用逻辑层,逻辑层调用数据层.不可以反过来 每个class文件都带了包名字,建好文件就可以了. /* * AddressApp.java * */ package cn.hncu.addr; import java.awt.Panel; import javax.swi

信息架构中信息类粒化简谈

当我们进一座写字楼的时候,找你想要去的房间,你会依据什么来指引到那个房间?当你到超市买东西的时候,什么东西指引你可以很快的找到你要去物柜?当你到达一个网站的时候,你依靠什么找到你要的信息?什么样的方式可以让你更加快捷的找到你所关注的目标信息?这时候,一个写字楼的楼层房间分布图谱,一个超市的物品分类,一个网站的信息架构就显示出它的作用了. 当我们找那个目标房间具体信息,房间的位置,朝南还是朝北,房间大小,距离电梯的距离等等,超市找物柜里面的物品,找红酒还是白酒,什么品牌,价格,是否有促销,是自己品

一起谈.NET技术,走向ASP.NET架构设计——第四章:业务层分层架构(后篇)

今天的内容比较简单,也是本章的一个收尾! Anemic Domain Model 这种模式和之前讲述的Domain Model有很多的相似的地方.在之前的Domain Model中,每个业务类都包含了自己的业务逻辑和数据,以及对象之前的关系:但是在Anemic Domain Model,每个业务类仅仅只是包含了一些保存业务数据的属性,把相应的业务规则从原本的业务类中移到了另外的一个专门的业务规则类(Specification Pattern,我们后面的章节讲述),同时把相应的业务方法移到了ser

一起谈.NET技术,发布NGuestBook(一个基于.NET平台的分层架构留言本小系统)

发布NGuestBook的动机说明      大约在半年前,我在博客上发表了一个系列文章:<基于.NET平台的分层架构实战>.当时在讲解过程中用到了一个叫NGuestBook的案例,在那以后,有很多朋友留言或发E-mail希望能得到NGuestBook的完整源代码,以便对照文章研究学习.但是,在当时NGuestBook只是我虚拟的一个案例,并没有成型的系统和完整的源代码.       但是后来一直有很多朋友询问这个事情,所以我觉得,将那个NGuestBook做出来还是很有必要的,所以,我花了两

.NET应用架构设计—重新认识分层架构(现代企业级应用分层架构核心设计要素)

阅读目录: 1.背景介绍 2.简要回顾下传统三层架构 3.企业级应用分层架构(现代分层架构的基本演变过程) 3.1.服务层中应用契约式设计来解决动态条件不匹配错误(通过契约式设计模式来将问题在线下暴露出来) 3.2.应用层中的应用控制器模式(通过控制器模式对象化应用层的职责) 3.3.业务层中的命令模式(事务脚本模式的设计模式运用,很好的隔离静态数据) 4.服务层作为SOA契约公布后DTO与业务层的DomainModel共用基本的原子类型 5.两种独立业务层职责设计方法(可以根据具体业务要求来搭

EntityFramework之领域驱动设计实践(二):分层架构

在引入实例以前,我们有必要回顾,并进一步了解分层架构."层"是一种体系结构模式[POSA1],也是被广大软件从业人员用得最为广泛而且最为灵活的模式之一.记得在CSDN上,时常有朋友问到:"分层是什么?为什么要分层?三层架构是不是就是表现层.业务逻辑层和数据访问层?" 到这里,你可能会觉得这些朋友的问题很简单,分层嘛,不就是将具有不同职责的组件分离开来,组成一套层内部高聚合,层与层之间低耦合的软件系统吗?不错!这是分层的目标.但是,我们应该如何分层呢? 领域驱动设计的