.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. 用DOS命令获取文件列表

    其实就是两个命令:dir 跟 tree 在C:盘根目录下生成了一个名为“filelist.txt”的文本文件,该文件中即包含D:盘的文件夹列表. dir d:\ >c:\filelist.txt ...

  2. OnWndMsg处理功能

    于MFC于, OnWndMsg功能,如以下处理步骤: 1)首先.被推断消息有一个消息响应函数.例如OnLButtonDown()处理"左新闻"新闻. 2)数.这里以MFC 的pro ...

  3. bitnami redmine 安装插件

    https://wiki.bitnami.com/Applications/BitNami_Redmine_Stack#How_to_install_a_plugin_on_Redmine.3f 版权 ...

  4. FPGA合成编码

    1 决策树 于FPGA推断使用if else报表及case达到. a) if else 是有特权的,类似于优先编码(当两个条件同一时候成立,仅推断条件靠前的成立),所以当有特权条件时应该採用if el ...

  5. Linux下find命令具体解释

    1. find命令 linux的find命令用来查找文件,功能非常强大, 能够通过时间, 用户组, 文件名称, 文件类型, 权限,大小等来查找对应文件. 2. find的使用方法 通过find --h ...

  6. fastboot完成自己主动命令

    于Ubuntu13.10后来Ubuntu 14.04上,由APT安装fastboot以及adb该工具后, 发现fastboot在主动补充一个问题,, fastboot flash 自己主动有问题完成后 ...

  7. 一张漫画说尽IT开发过程

  8. C# WinForm中实现CheckBox全选反选功能

    今天一群里有人问到这个功能,其实应该挺简单,但提问题的人问题的出发点并没有描述清楚.因此,一个简简单单的需求,就引起了群内热烈的讨论.下面看看这个功能如何去实现,先上效果: 下面直接上代码,请不要在意 ...

  9. extjs_09_定义自己的页面组件

    1.项目截图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWRhbV93enM=/font/5a6L5L2T/fontsize/400/fill/I0J ...

  10. C/C++基础笔试题1.1.2(十问解决方案运营商)

    他写在博客上不负责任,有人踩在上面,原因一点点失去了它. 其实纯常见问题.特别糟糕,由于鲍文看起来很大的优势就是想更直接看到的东西. 好了.返回整个标题. 1.你脑海中的运算符有哪些.按优先级排个序? ...