提到分层,我就想起一句图灵奖获得者说过的话:计算机科学领域任何问题,都可以间接的通过添加一个中间层来解决;当初看到这句话的时候还不能深刻的体会到这句话的真正灵魂是什么。之所以要写这篇文章作为技术爱好者之一更愿意与大家分享技术给我们带来的快乐,本人将从另一个角度来解析.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和调用方是完全没有任何依赖的在程序调用时候没有任何类型的调用所以在解决方案生成的时候不会将我们引用的项目程序集拷贝到执行目录中,如果想省略手工操作可以在执行查找的时候先调用一下实现层的对象,这样当编译生成的时候代码检查到你有调用会将你调用的项目程序集拷贝到执行目录中,在通过接口工厂动态查找时不会失败;

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

转载于:https://www.cnblogs.com/wangiqngpei557/archive/2011/05/04/2036097.html

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

  1. DDD领域驱动设计实战-分层架构及代码目录结构

    代码结构 DDD并没有给出标准的代码模型,不同的人可能会有不同理解. 按DDD分层架构的分层职责定义,在代码模型里分别为用户接口层.应用层.领域层和基础层,建立了 interfaces.applica ...

  2. 架构的变迁,从分层架构先聊起

    摘要:分层架构简单而高效,业界已经有很多成熟的应用,对那些项目刚刚起步,架构师们还没想好要采用哪种架构模式的系统而言,这是非常适合的. 前言 软件刚出现的时候,还是大型计算机的年代,一个软件系统一般都 ...

  3. 电子书《我的架构思想》小述

    接下来谈谈<我的架构思想>.上一篇是"电子书<程序原本>小述",在这里:http://blog.csdn.net/aimingoo/article/deta ...

  4. WLAN产品形态之分层架构

    随着移动互联网时代的来临,无线数据流量呈现爆发式增长,各大运营商也越来越多依靠WLAN来承载这些无线数据流量,大规模进行WLAN网络建设,分担3G网络的压力,让客户体验更加美好.无处不在的优质无线网络 ...

  5. dubbo 自定义路由_Dubbo分层架构概述

    本节我们从整体上来看看 Dubbo 的分层架构设计,架构分层是一个比较经典的模式,比如网络中的7层协议,每层执行固定的功能,上层依赖下层提供的功能,下层对上层提供功能,下层的改变对上层不可见,并且每层 ...

  6. DDD领域驱动设计-分层架构实践

    代码结构 项目是使用maven构建的springboot项目 基于DDD领域驱动分层架构设计,分为接口层interfaces.应用层application.领域层domain.基础设施代理层infra ...

  7. 客户端GUI测试技术和自动化测试架构设计简谈

    客户端GUI测试技术和自动化测试架构设计简谈 http://www.cnblogs.com/wiki-royzhang/p/3785033.html 客户端GUI测试技术和自动化测试架构设计简谈 客户 ...

  8. 互联网分层架构,为啥要前后端分离?

    作者:58神剑,来源:架构师之路 一,典型后端架构 通用业务服务化之后,系统的典型后端结构如上: web-server通过RPC接口,从通用业务服务获取数据 biz-service通过RPC接口,从多 ...

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

    发布NGuestBook的动机说明      大约在半年前,我在博客上发表了一个系列文章:<基于.NET平台的分层架构实战>.当时在讲解过程中用到了一个叫NGuestBook的案例,在那以 ...

  10. 数仓(三)简析阿里、美团、网易、恒丰银行、马蜂窝5家数仓分层架构

    上一篇我们介绍了数据集市的概念以及它和数仓的区别,并且重点论述了大数据数仓中的分层架构体系. 这篇我们简要分析一下以下5家公司的数仓分层架构模型: 1.马蜂窝数仓分层架构 2.阿里云MaxComput ...

最新文章

  1. python线下培训-天津python培训,0基础学python线上还是线下好?
  2. 剑指offer之python实现
  3. java 三维数组长方体求体积_已知任意一个四面体的六条棱长,如何求出其体积?...
  4. Python+OpenCV4:读写输入和输出的简单实践(图片、视频、摄像头)
  5. BootStrap中的日期时间组件datetimepicker
  6. tomcat发布web项目
  7. 使用PickerView
  8. java之随机生成名字
  9. 图像金字塔——pyrDown和pyrUp
  10. 关于matlab文献综述,Matlab文献综述
  11. 如何彻底删除微软自带输入法
  12. 解决lefse配置过程中遇到的问题
  13. 陶哲轩实分析 3.4 补充
  14. 股票分析之融资买入分析
  15. js中的深拷贝和浅拷贝
  16. 男士必须收藏:男士健身方案
  17. JAVA音视频解决方案----音频处理方案
  18. C语言英尺英寸和米的转换
  19. 山水印|竹林野茶:万丈红尘三杯酒,千秋大业一壶茶
  20. 进销存ERP系统、销售单、采购单、退货单、库存管理、库存盘点、调拨、借入、借出、出库、入库、归还单、收款单、付款单、资金流水、销售报表、采购报表、库存报表、财务报表、商品库、电商erp、连锁erp 1

热门文章

  1. 适合win7的python版本_Python 3.9 发布,不再支持 Win7!
  2. android 摄像头检测工具,检摄app2.0.2最新版(摄像头检测)
  3. 四叶草关闭啰嗦模式_教你如何解决 Win7 64位卡LOGO(四叶草)
  4. Python表白代码:“ 星光月夜烟花皆归你,我也归你”(满天烟花盛开、附番外玫瑰)
  5. JS遍历map集合以及map对象
  6. Python进阶之八皇后算法
  7. Python 定时任务的几种实现方式
  8. 微信小程序学习日记---模板(template)全解析
  9. disp语句怎么格式 matlab_matlab输出语句print
  10. matlab实现输出的几种方式