.NET逻辑分层架构演示:DDD分层架构的进化

概述:
 
架构是高层的设计,如果设计和理解有误,必将在实现时带来各种问题。架构又是最稳定的,不会因为各种具体技术的依赖,如各种UI框架、ORM框架、IoC框架的更新换代而受到影响。上文的总结没有任何Demo是因为架构更偏向于设计层面,有从设计视图创建解决方案经验的人,一看就知道我在说什么。本文将展示从架构设计视图到.NET多项目解决方案的过程。主要包含以下内容:
(1)演示DDD分层架构到.NET多项目解决方案的映射。
(2)演示DDD分层依赖到.NET项目引用的映射。
(3)演示依赖注入在.NET多项目解决方案中的使用。
 
 
一、原始的DDD分层
 
1.架构图
 
2.搭建解决方案
新建空白解决方案,添加如下项目:
(1)DDD.Domain类库项目。
(2)DDD.Application类库项目。
(3)DDD.Infrastructure类库项目。
(4)DDD.UI.MVC ASP.NET 空项目,选中MVC引用。
(5)DDD.Repository类库项目。
 
3.设置项目间的引用关系:
(1)DDD.UI.MVC添加DDD.Application、DDD.Domain、DDD.Infrastructure和DDD.Repository的引用。
(2)向DDD.Application添加DDD.Domain、DDD.Infrastructure引用。
(3)向DDD.Domain添加DDD.Infrastructure引用。
(4)向Repository项目添加DDD.Domain和DDD.Infrastructure引用。
 
4.使用依赖注入:
为了更彻底的解耦,我们即使对依赖注入的实现也应用依赖倒置原则,我们不依赖任何具体的IoC框架及其种类和版本。在基础设施层中使用2种不同的IoC框架实现了该接口,并且在使用时展示了通过直接注入和通过反射两种方式。通过反射可以将IoC的实现依赖使用配置文件管理。
(1)IoC抽象接口
(2)管理类
(3)管理依赖注入
 
5.代码图和解决方案视图:
代码图赤裸裸的告诉我们三个字“不和谐”:
(1)看起来更像以基础设施层为核心。
(2)Repository无法置于基础设施层,即使你将它的命名空间改为DDD.Infrastructure.Repository也没有用。
(3)领域层对外有依赖。
(4)看了架构图谁能跟这代码图对应上?
 
Demo1下载:点击下载
 
二、改善的DDD分层
 
1.架构图
 
2.搭建解决方案
新建空白解决方案,添加如下项目:
(1)DDD.Domain类库项目。
(2)DDD.Application类库项目。
(3)DDD.Infrastructure类库项目。
(4)DDD.UI.MVC ASP.NET 空项目,选中MVC引用。
 
3.设置项目间的引用关系:
 
(1)DDD.UI.MVC添加DDD.Application、DDD.Domain和DDD.Infrastructure的引用。
(2)向DDD.Application添加DDD.Domain、DDD.Infrastructure引用。
(3)向DDD.Infrastructure添加DDD.Domain引用。
 
 
4.改善:
(1)IEntity和IRepository接口定义在领域层,领域层不再依赖基础设施层。
(2)Repository真正在基础设施层实现。
 
5.代码图和解决方案视图:
看起来很不错:
(1)和架构图完美对应。
(2)领域层为中心。
(3)再也不用为基础设施层无法引用领域层而在服务层添加不必要的代码了。
Demo2下载:点击下载
 
三、最新的DDD分层
1.架构图
2.搭建解决方案:同上
 
3.设置项目间的引用关系:

 
(1)DDD.UI.MVC添加DDD.Application、DDD.Domain和DDD.Infrastructure的引用。
(2)向DDD.Application添加DDD.Domain引用。
(3)向DDD.Infrastructure添加DDD.Application和DDD.Domain引用。
 
4.改进:
(1)将IService接口定义在应用层。
(2)进一步将所有依赖的接口定义在领域层和应用层,包括依赖注入管理。
 
5.代码图和解决方案视图:
更好理解和使用:
(1)在架构级别,以领域为核心,将其他技术依赖抹平到一个实现层次,写代码再也不用担心不知道往哪写了。
(2)将领域逻辑和应用逻辑扔到应用层和领域层,所有依赖扔到实现层,架构图就是解决方案视图。
(3)在三种解决方案中,依赖最少,依赖方向一致,最易理解和使用。
 
 
Demo3下载:点击下载
 
参考
1.Patterns of Enterprise Application Architecture 【企业应用架构模式】
2.Domain-Driven Design 【领域驱动设计:软件核心复杂性应对之道】
3.Applying Domain-Driven Design and Patterns【领域驱动设计与模式实战】
4.Implementing Domain-Driven Design 【实现领域驱动设计】
5.Microsoft Application Architecture Guide 【微软应用架构指南(第2版)】
6.Professional Enterprise .NET 【精通.NET企业项目开发:最新的模式、工具与方法】
7.Professional ASP.NET Design Patterns 【ASP.NET设计模式】
 
本文出自:http://www.cnblogs.com/easygame/
如果这篇博客内容对您稍有帮助或略有借鉴,请您推荐它帮助更多的人。

DDD分层架构的进化的更多相关文章

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

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

  2. 应用程序框架实战十七:DDD分层架构之值对象(层超类型篇)

    上一篇介绍了值对象的基本概念,得到了一些朋友的支持,另外也有一些朋友提出了不同意见.这其实是很自然的事情,设计本来就充满了各种可能性,没有绝对正确的做法,只有更好的实践.但是设计与实践的好与坏,对于不 ...

  3. 应用程序框架实战十六:DDD分层架构之值对象(介绍篇)

    前面介绍了DDD分层架构的实体,并完成了实体层超类型的开发,同时提供了验证方面的支持.本篇将介绍另一个重要的构造块——值对象,它是聚合中的主要成分. 如果说你已经在使用DDD分层架构,但你却从来没有使 ...

  4. 应用程序框架实战十五:DDD分层架构之领域实体(验证篇)

    在应用程序框架实战十四:DDD分层架构之领域实体(基础篇)一文中,我介绍了领域实体的基础,包括标识.相等性比较.输出实体状态等.本文将介绍领域实体的一个核心内容——验证,它是应用程序健壮性的基石.为了 ...

  5. 应用程序框架实战十四:DDD分层架构之领域实体(基础篇)

    上一篇,我介绍了自己在DDD分层架构方面的一些感想,本文开始介绍领域层的实体,代码主要参考自<领域驱动设计C#2008实现>,另外参考了网上找到的一些示例代码. 什么是实体 由标识来区分的 ...

  6. 应用程序框架实战十三:DDD分层架构之我见

    前面介绍了应用程序框架的一个重要组成部分——公共操作类,并提供了一个数据类型转换公共操作类作为示例进行演示.下面准备介绍应用程序框架的另一个重要组成部分,即体系架构支持.你不一定要使用DDD这样的架构 ...

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

    前面介绍了应用程序框架的一个重要组成部分——公共操作类,并提供了一个数据类型转换公共操作类作为示例进行演示.下面准备介绍应用程序框架的另一个重要组成部分,即体系架构支持.你不一定要使用DDD这样的架构 ...

  8. DDD分层架构之仓储

    DDD分层架构之仓储(层超类型基础篇) 前一篇介绍了仓储的基本概念,并谈了我对仓储的一些认识,本文将实现仓储的基本功能. 仓储代表聚合在内存中的集合,所以仓储的接口需要模拟得像一个集合.仓储中有很多操 ...

  9. DDD分层架构之聚合

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

随机推荐

  1. FastDFS设备、构造、配置()一-安装和部署

    FastDFS是一个开源的.高性能的的分布式文件系统,他基本的功能包含:文件存储.同步和訪问,设计基于高可用和负载均衡,FastDFS很适用于基于文件服务的站点.比如图片分享和视频分享站点 FastD ...

  2. 追索权 Eclipse + NDK error: stray &#39;\24&#39; in program

    [size=16px][b][color=#FF0000]追索权 Eclipse + NDK  error: stray '\24' in program[/color][b][/b][/b][/si ...

  3. Html5用Canvas制作画图板

    需求: 绘制多边形 可填充颜色 可设置文字 可移动,可删除 鼠标按住后,抬起之前线段应该尾随鼠标当前位置 可与后台方便的进行数据交互,保存到后台,或将数据从后台取到前台显示对应的图形 思考: 第一想到 ...

  4. RH133读书笔记(8)-Lab 8 Manage Network Settings

    Lab 8 Manage Network Settings Goal: To build skills needed to manually configure networking Estimate ...

  5. Effective Java (7) - 避免终止方法

    一. 基本概念 1. 所谓的终结方法事实上是指finalize(). 2. Java的垃圾回收机制仅仅负责内存相关清理.其它资源的清理(释放文件.释放DB连接)须要程序猿手动完毕. 3. 调用Syst ...

  6. javascript于&quot;return obj === void 0&quot;这样的书面理由和优势

    得知underscore.js什么时候,查看源代码经常出现的类别似下面的代码: if (context === void 0) return func; if (array == null) retu ...

  7. 【iOS】Swift扩展extension和协议protocol

    加上几个关节前Playground摘要码进入github在,凝视写了非常多,主要是为了方便自己的未来可以Fanfankan. Swift语法的主要部分几乎相同的. 当然也有通用的.运算符重载.ARC. ...

  8. Centos 7 静态学习IP建立

    该研究主要集中在 Centos 7.0.1406 学习整理版! 1.编者 ifcfg-eth0 档,vim 同时尽量减少未安装安装,你并不需要自己安装叙述性说明. # vim /etc/sysconf ...

  9. Python 摘录LinkedIn用户联系人

    CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-8-18 @author: guaguastd @name: l ...

  10. HDU 5012 Dice (BFS)

    事实上是非常水的一道bfs,用字符串表示每一个状态,map判重就ok了. 题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5012 #include&l ...