.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. 最少拦截系统(杭电1257)(DP)+(贪心)

    最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  2. 在python正在使用mysql

    缘由 近期在折腾一个小东西须要抓取网上的页面.然后进行解析.将结果放到数据库中. 了解到Python在这方面有优势,便选用之. 由于我有台server上面安装有mysql,自然使用之.在进行数据库的这 ...

  3. Android 建立View 圆角

    虽然很easy,不过还是录制. 混合参观 在drawable文件下 创建一个布局文件corners_bg.xml <?xml version="1.0" encoding=& ...

  4. JSP简单练习-站点计数器

    <%@ page contentType="text/html;charset=gb2312" %> <%@ page import="javax.se ...

  5. AM335x(TQ335x)学习笔记——u-boot-2014.10移植

    根据最近移植u-boot-2014.10至TQ335x,基于这样的假设am335x evm移植.不是很多地方需要改变. 因为TI的am335x evm开发了使用eeprom船上保存配置信息.它使用不同 ...

  6. (DDD)仓储的思考

    (DDD)仓储的思考 为什么需要仓储呢?领域对象(一般是聚合根)的被创建出来后的到最后持久化到数据库都需要跟数据库打交道,这样我们就需要一个类似数据库访问层的东西来管理领域对象.那是不是我们就可以设计 ...

  7. 走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能

    原文:走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能 最近公司来一个非常虎的dba  10几年的经验 这里就称之为蔡老师吧 在征得我们蔡老同意的前提下  我们来分享一下蔡老给我们 ...

  8. PHP邮件发送(转)

    php带有内置的mail() 发送邮件函数,但是较为繁琐:建议上网下载一个PHPMailer:

  9. Node.js v0.10.31API手冊-事件

    Node.js v0.10.31API手冊-文件夹 Events(事件) Node里面的很多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStrea ...

  10. 使用 Advanced Installer 打包 一键安装Web应用程序

    原文:使用 Advanced Installer 打包 一键安装Web应用程序 安装预览: 资源下载: 示例安装包 操作流程: 1.新建Asp.net Application. 2.设置应用程序名称和 ...