引言

本文提到的分层只是软件架构上的分层。文中的传统分层指的是传统的三层结构:UI(界面表现层),BLL(业务逻辑层),DAL(数据访问层)。文中提出的观点也都是个人的一点认识,与任何组织没有关系,如有异议,还请各位踊跃拍砖。

当然了,出现的这些问题,也可能只是我个人的问题,不代表每个人都存在。无则加勉,有则改正吧。如果是个人的问题,那就当是个人总结吧,大家看看就算了。

这里说到的传统分层,也有可能是我对于分层的错误理解造成的,但是我看见的不只是我的项目是这么的结构,很多的项目也都是这样的结构。里面的代码, 都和我理解的一样,至少可以说明,还是有一部分人犯了和我一样的错误。

传统分层

传统分层最大的问题就在于割裂了上层与下层之间的联系,把他们之间的关系变成了简单的接口调用,变成了完全的接口形式主义。同时,忽略了下层是为上层提供服务的,不是单独存在的,下层提供的服务应该受到上层的规约。当然,也不是说不可以提供更多的服务,但是至少应该提供上层需要的,然后再考虑提供一些“边角料”。

我们先看一个传统分层的解决方案结构。

相互之间的引用关系是:UI引用BLL、Entity、Common;BLL引用IDAL、Entity、Common;IDAL引用Entity;DAL引用IDAL、Entity、Common。

显示行号 复制代码 ? UI  Code
  1. private void button1_Click(object sender, EventArgs e)
    
  2.        {
    
  3.            _02_BLL.OrderBll orderBll = Common.ServiceLocator.LoadService<_02_BLL.OrderBll>();
    
  4.            orderBll.SubmitOrder(new _05_Entity.OrderEntity()
    
  5.            {
    
  6.                OrderSeqNo = "123",
    
  7.                OrderAmount = 1000
    
  8.            });
    
  9.        }
    

显示行号 复制代码 ? BLL Code
  1. public class OrderBll
    
  2.    {
    
  3.        IOrderDal _orderDal;
    
  4.        public OrderBll()
    
  5.        {
    
  6.            _orderDal = Common.ServiceLocator.LoadService<_03_IDAL.IOrderDal>();
    
  7.        }
    
  8.        public bool SubmitOrder(OrderEntity order)
    
  9.        {
    
  10.            return _orderDal.Add(order);
    
  11.        }
    
  12.    }
    

显示行号 复制代码 ? IDAL Code
  1. public interface IOrderDal
    
  2.     {
    
  3.         bool Add(OrderEntity order);
    
  4.     }
    

显示行号 复制代码 ? DAL Code
  1. public class OrderDal:_03_IDAL.IOrderDal
    
  2.    {
    
  3.        public bool Add(_05_Entity.OrderEntity order)
    
  4.        {
    
  5.            IDbConnection conn = new SqlConnection();
    
  6.            conn.Open();
    
  7.            IDbCommand comm = conn.CreateCommand();
    
  8.            IDbDataParameter param = comm.CreateParameter();
    
  9.            param.Direction = ParameterDirection.Input;
    
  10.            param.DbType = DbType.String;
    
  11.            param.ParameterName = "OrderSeqNo";
    
  12.            if (comm.ExecuteNonQuery() > 0)
    
  13.                return true;
    
  14.            else
    
  15.                return false;
    
  16.        }
    
  17.    }
    

显示行号 复制代码 ? Unity Container Locator
  1. using System.Configuration;
    
  2. using System.Globalization;
    
  3. using Microsoft.Practices.Unity;
    
  4. using Microsoft.Practices.Unity.Configuration;
    
  5. using Microsoft.Practices.Unity.InterceptionExtension;
    
  6. using System.Web;
    
  7. using System;
    
  8. namespace Common
    
  9. {
    
  10.     public static class ServiceLocator
    
  11.     {
    
  12.         // private static readonly InterfaceInterceptor  injector = new InterfaceInterceptor ();
    
  13.         private static readonly TransparentProxyInterceptor injector = new TransparentProxyInterceptor();
    
  14.         public static IUnityContainer Container
    
  15.         {
    
  16.             get;
    
  17.             private set;
    
  18.         }
    
  19.         static ServiceLocator()
    
  20.         {
    
  21.             Container = new UnityContainer();
    
  22.             UnityConfigurationSection unitySection = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
    
  23.             if (unitySection == null)
    
  24.             {
    
  25.                 throw new ConfigurationErrorsException(string.Format(CultureInfo.CurrentCulture, "missing unity configuration section"));
    
  26.             }
    
  27.             Container.AddNewExtension<Interception>();
    
  28.             unitySection.Configure(Container, "Container");
    
  29.         }
    
  30.         /// <summary>
    
  31.         /// 没?有D为a映3射?指?定¨别e名?
    
  32.         /// name属?性?没?有D赋3值μ
    
  33.         /// </summary>
    
  34.         /// <typeparam name="T"></typeparam>
    
  35.         /// <returns></returns>
    
  36.         public static T LoadService<T>()
    
  37.         {
    
  38.             Container.Configure<Interception>().SetDefaultInterceptorFor<T>(injector);
    
  39.             return Container.Resolve<T>();
    
  40.         }
    
  41.         /// <summary>
    
  42.         /// 为a映3射?指?定¨别e名?
    
  43.         /// name属?性?赋3值μ
    
  44.         /// </summary>
    
  45.         /// <typeparam name="T"></typeparam>
    
  46.         /// <param name="serviceName"></param>
    
  47.         /// <returns></returns>
    
  48.         public static T LoadService<T>(string serviceName)
    
  49.         {
    
  50.             Container.Configure<Interception>().SetDefaultInterceptorFor<T>(injector);
    
  51.             return Container.Resolve<T>(serviceName);
    
  52.         }
    
  53.     }
    
  54. }
    

上层在调用下层的时候,不是调用自己需要的,而是从下层提供的服务中筛选一些可以用的,凑合用一下。如果发现没有自己可以用的,就在IDAL文件中添加一个,然后在DAL文件中实现以下,这下好了,BLL可以用了。这样也会造成在开发DAL层的时候,没有充分考虑BLL的需要,自己盲目实现一些,然后BLL用的时候,才发现很多还要重新写。造成大量的浪费,代码、人力、时间、精力都浪费一部分了。也会影响到开发的进度。

新式分层,抑或叫做DDD分层

说是新式分层,其实也是我随便叫的。就是这段时间看了博客园的一些DDD文章,还有就是codeplex上的两个项目NLayerApp和SmartCA的源码。看了这些之后,有的一点理解。不管是神似还是形似吧,反正觉得比以前传统分层有一点道理,就分享出来了,也挣点人气,骗点点击量,哈哈。

先来一张图吧。

DDD中的分层主要是四层:Presentation(表现层),Application(应用层),Domain(领域层),Infrastructure(基础层)。

Presentation相当于以前的UI层。Application是一个任务的调度层,没有实际的业务逻辑,也不推荐放入业务逻辑,实际中可以用Wcf来代替,或者使用普通的类库就可以。其实就是根据UI的业务调用,然后映射到具体的领域对象身上去。也可以通过Application来暴露粗粒度的业务处理,因为领域层的业务处理是细粒度的。没有了以前的DAL,把它的部分放入了Infrastructure层。

以前的IDAL被放入了Domain,在图上,是Domain.Core项目,这个项目会被Infrastructure引用。因为Domain.Core中的IDAL相当于是领域对象对于持久化提出的要求,也就是说必须要实现这些功能,这些都是领域对象需要的。具体的如何实现,具体如何持久化,是持久化到关系数据库还是文件系统,还是内存数据库,都由具体的实现来定义。也就是图中的Infrastructure.Data.Core和Infrastructure.Data.MainModule项目。这两个项目中的实现,实现的都是领域对象持久化所需要的,不会实现一大丢不必要的方法。不知道这算不算是改进呢?

结论

传统分层,或者说是我理解的传统分层,存在的问题就是割裂层之间的联系,形式化了层之间的联系。没有表达出上层对于下层的需要,下层是为上层服务的,这些联系。DDD的分层可以解决这个问题,会提高开发的效率,少走一些弯路。

不知道大家是如何认识的呢????????期待大家的回复,拍砖。

转载于:https://www.cnblogs.com/virusswb/archive/2011/01/10/1931964.html

小议传统分层与新式分层,抑或与DDD分层相关推荐

  1. 适合传统节日促销首焦设计的PSD分层模板

    年终岁尾,佳节将至,每逢年末,都是零售商家的销售旺季,而往往在这个节点上,促销成为必要的营销手段. 与一般的促销意义不同,节日根据传统的影响较大,所以更加需要注意节日的各种风俗.礼仪.习惯等民族特点, ...

  2. DDD分层架构最佳实践

    还在单体应用的时候就是分层架构一说,我们用得最多的就是三层架构.而现在已经是微服务时代,在微服务架构模型比较常用的有几个,例如:整洁架构,CQRS(命令查询分离)以及六边形架构.每种架构模型都有自己的 ...

  3. ddd架构 无法重构_漫谈分层架构:为什么要进行架构分层?

    为什么要分层 高内聚:分层的设计可以简化系统设计,让不同的层专注做某一模块的事 低耦合:层与层之间通过接口或API来交互,依赖方不用知道被依赖方的细节 复用:分层之后可以做到很高的复用 扩展性:分层架 ...

  4. 这 3 种 DDD 分层架构的模式,你掌握了么?

    -     前言    - 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. -     DDD 的基本概念     - DDD(Domain DrivenDesign, ...

  5. DDD分层架构的三种模式

    本文来说下DDD分层架构的三种模式 文章目录 概述 DDD 分层架构 模式一:四层架构 模式二:五层架构 模式三:六边形架构 本文小结 概述 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和 ...

  6. 应用程序框架实战十八:DDD分层架构之聚合

    前面已经介绍了DDD分层架构的实体和值对象,本文将介绍聚合以及与其高度相关的并发主题. 我在之前已经说过,初学者第一步需要将业务逻辑尽量放到实体或值对象中,给实体"充血",这样可以 ...

  7. 还在搞三层架构?了解下 DDD 分层架构的三种模式吧 !

    来源:jianshu.com/p/a775836c7e25 引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. DDD DDD(Domain DrivenDesign ...

  8. 还在搞三层架构?了解下 DDD 分层架构的三种模式吧

    引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高 ...

  9. 什么是DDD分层架构

    还在单体应用的时候就是分层架构一说,我们用得最多的就是三层架构.而现在已经是微服务时代,在微服务架构模型比较常用的有几个,例如:整洁架构,CQRS(命令查询分离)以及六边形架构.每种架构模型都有自己的 ...

最新文章

  1. docker from指令的含义_Docker中Dockerfile多From 指令存在的意义
  2. C++ map的使用
  3. 如何使用python批量下载-使用 Python + Selenium 批量下载素材
  4. dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3(十)之Spring MVC中使用 Swagger2 构建Restful API...
  5. jar包名冲突gradle_jar包又冲突了?如何快速确定与哪个jar包冲突?
  6. el表达式大小写问题的坑坑坑坑坑坑坑坑!!!
  7. Web IOC 容器初体验
  8. day10 Python 形参顺序
  9. 继iptables之后的新一代包过滤框架是nftables
  10. 关系运算符 与 逻辑运算符
  11. 实验:基于keepalived实现两台realserver服务器中的nginx和php-fpm服务互为主从
  12. 剑指offer所有的题目总结(转)
  13. 归并排序的空间复杂度
  14. 广色域图片Android,Android Q将支持广色域照片
  15. Atitit 项目中的勋章体系,,mvp建设 ,荣典体系建设
  16. fiddler4苹果手机证书无法使用的问题解决方案
  17. 台式计算机电源机箱维修,终于理会电脑电源故障的维修方法
  18. 苹果电脑Chrome浏览器截网页长图
  19. c语言编程三角形面积计算,c语言计算三角形面积代码
  20. IntelliJ IDEA常用插件介绍和配置

热门文章

  1. React开发(124):ant design学习指南之form中的属性isFieldTouched
  2. 前端学习(3153):react-hello-react之脚手架文件介绍
  3. 前端学习(3131):react-hello-react之总结ref
  4. 前端学习(3117):react-hello-react的类中的方法
  5. 前端学习(2971):前一天回顾
  6. [html] 你写一个页面需要多长时间?
  7. [css] 你知道css的预处理器和后处理器都有哪些吗?它们有什么区别呢?
  8. 工作279:控制退回的逻辑修改
  9. 前端学习(2843):UI插件开发
  10. 前端学习(2569):如何跨组件调用实例