.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. Android学习路径(十)怎么会Action Bar堆放在布局

    默认情况下.action bar出如今activity窗体的顶部.稍微降低了activity布局的总空间. 假设你想隐藏或者显示action bar.在这堂用户体验的课程中,你能够通过调用hide() ...

  2. ramoops具体失败原因来解释驱动寄存器

    正在使用linux的ramoops驱动器模块,当编译完成加载.查找驱动程序加载失败.显然,直接用内核代码,为什么会出现这种情况? 第一眼ramoops初始化代码: 180 static int __i ...

  3. 系列五AnkhSvn

    原文:系列五AnkhSvn AnkhSvn介绍 AnkhSVN是一款在VS中管理Subversion的插件,您可以在VS中轻松的提交.更新.添加文件,而不用在命令行或资源管理器中提交.而且该插件属于开 ...

  4. 【DP专辑】ACM动态规划总结

    转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 ...

  5. Hybrid app 发展历程

    距离上一篇<基于微信 js-sdk 的简单应用>已经快一年了,说来真是惭愧.上次不久之后便换了工作,一直处于比较忙的状态.其次后面酣畅一段时间都没有从事移动相关的工作.直到今年3月份开始, ...

  6. javascript变量,作用域和内存问题(一)

          js对象的引用是很有意思的,引用型对象是不可以直接引用的,我猜测这是原型的来源之一,有大神请详解或斧正.    “引用类型的值是保存在内存中的对象.与其他语言不同,JavaScript不允 ...

  7. UVa - The 3n + 1 problem 解读

    这个问题并计算质数了一下相间隔似的.思想上一致. 注意问题: 1 i 可能 大于或等于j -- 这里上传.小心阅读题意,我没有说这个地方不能保证.需要特殊处理 2 计算过程中可能溢出,的整数大于最大值 ...

  8. fastjson经常用法

    首先,JSON究竟是什么? JSON就是一串字符串 仅仅只是元素会使用特定的符号标注. {} 双括号表示对象 [] 中括号表示数组 "" 双引號内是属性或值 : 冒号表示后者是前者 ...

  9. 【web开发学习笔记】Structs2 Action学习笔记(两)

    action学习笔记2-大约action method讨论 Action运行的时候并不一定要运行execute方法,能够在配置文件里配置Action的时候用method=来指定运行哪个方法 也能够在u ...

  10. Https 客户端与服务器交互过程梳理(转)

    本文试图以通俗易通的方式介绍Https的工作原理,不纠结具体的术语,不考证严格的流程.我相信弄懂了原理之后,到了具体操作和实现的时候,方向就不会错,然后条条大路通罗马.阅读文本需要提前大致了解对称加密 ...