.NET应用架构设计—面向查询的领域驱动设计实践(调整传统三层架构,外加维护型的业务开关)

阅读目录:

  • 1.背景介绍
  • 2.在业务层中加入核心领域模型(引入DomainModel,让逻辑、数据有家可归,变成一个完整的业务对象)
  • 3.统一协调层Application Layer(加入协调层来转换DomianModel)
  • 4.从数据扁平结构转换成OO体系结构(使用OO丰富代码结构)
  • 5.DomainModel中的内容(带开关的Specification、SOA化的Specification)
  • 6.模式、重构、单元测试在领域模型中的运用

1.背景介绍

由于时间关系废话不多扯了,直奔主题,对领域驱动设计不是太了解的朋友请先熟悉相关主题或参考本人以下两篇文章:

.NET领域驱动设计—初尝(疑问、模式、原则、工具、过程、框架、实践),这篇文章对领域驱动设计的基本精神详细分析;

.NET领域驱动设计—实践(穿过迷雾走向光明) ,这篇文章对领域驱动设计的一个基本实践,记录下了实践过程、建模的技巧等内容;

DomainModel是由很多细粒度的Object组成,按照以往的教训(将Object行为、数据肢解,得到一个残缺的Object),现在我们将逻辑行为和数据绑定在一起,形成了一个丰富的领域模型,这也是面向对象设计原则之一;想了解更多关于实现面向对象的技巧请参考【《实现模式》作者:Kent Beck】一书;

但是这样又带来了由于充血型DDD模型会给面向大规模查询的业务模块带来一定的性能开销,试想一个OrderManager对象,如果我们需要获取在某个条件范围类的所有Order会给OrderManager带来很多性能、逻辑上的复杂度;根据DDD.CQRS架构,得知将DomainModel中的查询逻辑单独剥离出去,让Command端很干净的处理聚合的写逻辑,在Query端也很直接的处理查询逻辑;

这样设计之后会有一个很尴尬的情况,在Query端的DomainModel不被关注了,因为Query的逻辑有简单有复杂,大型站点会有很多复杂的查询逻辑还会有很多的业务开关,做过维护的朋友应该知道新功能上线需要有switch的控制,这是为了安全起见吧;但是简单的业务逻辑就会被我们下意识的认为不需要使用完整的DomainModel结构,还是使用传统的分层架构上层依赖下层,Business Layer直接依赖DataAccess Layer,其实这个时候Business Object已经不在是遵循“单一职责”原则了,这样时间一长又慢慢的回到了以前肢解Object的困境;

这篇文章是讲解如何在Query端实践DDD,如何运用DDD的强项来解决复杂业务逻辑的实现,尤其是复杂的业务逻辑需要开关控制的时候其实更需要DomainModel来完成;

2.在业务层中加入核心领域模型(引入DomainModel,让逻辑、数据有家可归,变成一个完整的业务对象)

由于我们缺乏领域模型,所以导致我们的业务逻辑、规则随波逐流,无家可归,时间久了就搞不清到底这块业务逻辑是哪里的;我们现有的Domain Model是一个数据映射对象用来传递数据用的,严格意义是一个DTO对象,大部分的项目都将DTO命名为DomainModel但是其实里面没有任何的行为、方法,只是一个纯粹的数据传输用的容器,所以称不上DomainModel;

所以我们首先要做的就是加入DomainModel,然后逐渐将逻辑搬移到DomainModel中来,在进行逐步的重构、单元测试,让其成为一个可以测试的具有一定核心价值的可重用的DomainModel;

3.统一协调层Application Layer(加入协调层来转换DomainModel)

我们的Service没有Application Layer  也称协调层,专门用来组装业务处理环节的统一调度中心,它并非只是一个简单的静态类;传统三层中没有应用层的概念或者说应用层的概念没扭曲了,或者并没有发挥其的核心作用;我们需要加入应用层来协调DomainModel的工作;

4.从数据扁平结构转换成OO体系结构(使用OO丰富代码结构)

当我们使用DTO对象成功将数据从数据源获取之后,就需要一个对象化的过程,将扁平化的数据实体转换成丰满的领域模型,这个时候所有的领域规则将起作用;

5.DomainModel中的内容(带开关的Specification、SOA化的Specification)

1.实体:

简单理解为OO对象,可以独立存在也可以聚合在某个领域实体下,如果聚合在某个实体下那么只能通过父级实体进行一系列的访问;

2.工厂:

对实体进行有相关约定的创建,这其中包括各种验证、约束、开关等等前提条件。注意:创建实体不像创建数据DTO那么简单;

3.规约、规约工厂:

对业务规则进行对象化,将原本淹没在杂乱无章代码中的核心业务规则提取出来统一管理;这可以很好的像规则配置化(专业称:规则外挂);注意:这可以和我们的业务开关进行合并;最值得惊喜的是可以通过规约工厂来实现面向SOA的规约;

4.领域事件(扩展):

监控、观察等等非侵入式的获取实体在业务处理当中的状态数据,如:发送一封邮件、记录一条LOG,但是这种代码严禁写入业务逻辑层包括分层架构中的任何一个层面,它必须是在一个无关紧要的宿主中进行,类似管道模型的Module;

5.面向特定业务开关:

由于我们每次添加或修改业务逻辑都会加入相应的开关控制,如果这个开关是和业务逻辑相关的那么就可以很巧妙的和规约合并设计;

6.模式、重构、单元测试在领域模型中的运用

设计模式的运用:通过运用DDD就可以方便的对Domain Model进行设计模式的强粒度运用;

重构的运用:对领域模型进行重构就不需要考虑业务逻辑会影响到其他层面;

单元测试的运用:可以独立对领域模型进行测试,包括细粒度的接口抽取都会很方便;

 

总结:由于时间关系文中都是精简的介绍,具体的理解可以参考我上传的代码示例:http://files.cnblogs.com/wangiqngpei557/3WDDDDemo.zip

 

作者:王清培

出处:http://www.cnblogs.com/wangiqngpei557/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

时间: 2024-09-17 12:54:41

.NET应用架构设计—面向查询的领域驱动设计实践(调整传统三层架构,外加维护型的业务开关)的相关文章

领域驱动设计系列(转)

曾经参与过系统维护或是在现有系统中进行迭代开发的软件工程师们,你们是否有过这样的痛苦经历:当需要修改一个Bug的时候,面对一个类中成百上千行的代码,没有注释,千奇百怪的方法和变量名字,层层嵌套的方法调用,混乱不堪的结构,不要说准确找到Bug所在的位置,就是要清晰知道一段代码究竟是做了什么也非常困难.最终,改对了一个Bug,却多冒出N个新Bug.同样的情况,当你拿到一份新的需求,需要在现有系统中添加功能的时候,面对一行行完全过程式的代码,需要使用一个功能时,不知道是应该自己编写,还是应该寻找是否已

我眼中的领域驱动设计(转)

有幸参与了一些领域驱动的项目,读了一些文章,也见识了一些不伦不类的架构,感觉对领域驱动有了更进一步的认识.所以今天跟大伙探讨一下领域驱动设计,同时也对一些想要实践领域驱动设计却又无处下手,或者一些正在实践却又说不上领域驱动设计到底好在哪的朋友一些指引方向.当然对于"领域驱动设计"这个主题而言从来不乏争论,所以大家可以在畅所欲言. 为什么要使用领域驱动设计? 从Eric Evans的<领域驱动设计:软件核心复杂性应对之道>一书的书名就可以看出这一方法论是为了解决软件核心复杂性

EntityFramework 之领域驱动设计实践

写在前面 其实这系列文章已经被很多网友转载过了,我自己也在前面的博客中给出了原文的链接.但毕竟博客园的人气更旺,加上不少网友强烈要求我把文章转贴到博客园,因此最终下定决心,将这系列文章重新整理并转贴在博客园上. 根据网友的讨论结果,以及自己在实践中的不断积累,在整理的过程中,我会将原文中的描述作相应调整.不仅如此,也有不少关心领域驱动设计的网友在原文的评论栏目中提了问题或作了批注,我也针对网友的问题给予了细致的答复,为了能够让更多的朋友了解到问题的本质,本次整理稿会将评论部分也一一列出,供大家参

.NET应用架构设计—面向查询服务的参数化查询设计(分解业务点,单独配置各自的数据查询契约)

阅读目录: 1.背景介绍 2.对业务功能点进行逻辑划分(如:A.B.C分别三个业务点) 2.1.配置映射关系,对业务点配置查询契约(构造VS插件方便生成查询契约) 2.2.将配置好的映射策略文件放在调用端,与服务不耦合 3.Dynamic.Dom动态构造服务端对象(Dynamic.DOM实现动态DOM) 1.背景介绍 现在越来越多的公司都在尝试SOA架构的实践,本人最近也在尝试学习这方面的技术,但是在实践过程中遇到一个问题,我想这个问题也是我们普遍实践者都应该会遇到的问题,问题描述如下: 我们有

.NET领域驱动设计—看DDD是如何运用设计模式颠覆传统架构

阅读目录: 1.开篇介绍 2.简单了解缘由(本文的前期事宜) 3.DomainModel扩展性(运用设计模式设计模型变化点) 3.1.模型扩展性 3.2.设计模式的使用(苦心专研的设计模式.设计思想可以随意使用了) 3.3.部分类的使用(封装内部对象) 3.4.高强度的OO设计(面向特定领域的高度抽象设计形成特定领域框架) 4.DomainModel业务逻辑规则配置(将扩展点分离后使用适当的配置将规则IOC进去) 5.DDD简单总结(DDD是什么?它是"战术")  1]开篇介绍 这篇文

EntityFramework之领域驱动设计实践(二):分层架构

在引入实例以前,我们有必要回顾,并进一步了解分层架构."层"是一种体系结构模式[POSA1],也是被广大软件从业人员用得最为广泛而且最为灵活的模式之一.记得在CSDN上,时常有朋友问到:"分层是什么?为什么要分层?三层架构是不是就是表现层.业务逻辑层和数据访问层?" 到这里,你可能会觉得这些朋友的问题很简单,分层嘛,不就是将具有不同职责的组件分离开来,组成一套层内部高聚合,层与层之间低耦合的软件系统吗?不错!这是分层的目标.但是,我们应该如何分层呢? 领域驱动设计的

DDD领域驱动设计基本理论知识总结

领域驱动设计之领域模型 加一个导航,关于如何设计聚合的详细思考,见这篇文章. 2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity in the Heart of Software (领域驱动设计),简称Evans DDD.领域驱动设计分为两个阶段: 以一种领域专家.设计人员.开发人员都能理解的通用语言作为相互交流的工具,在交流的过程中发现领域概念,然后将这些概念设计成一个领域模型: 由领域模型驱动软件设计,用代码来实现该领域模型

领域驱动设计-相关理论

最近 Rafy 开源中心 启动刚一个月,在初始的讨论会上,成员们对面向对象设计.领域驱动设计等概念展开了大量的讨论. 下面我转载一篇文章,这篇文章的详细内容我都还没看完.不过,文章的结构正是我想要的!其结构非常清晰,很好地说明了领域驱动设计相关的起源.重点.模式.经典架构,以及一些后人扩展的新概念. 转载自<DDD领域驱动设计基本理论知识总结>,并稍微调整了一下内容顺序. 为什么面向对象比面向过程更能适应业务变化 对象将需求用类一个个隔开,就像用储物箱把东西一个个封装起来一样,需求变了,分几种

.NET领域驱动设计—实践(穿过迷雾走向光明)

阅读目录 开篇介绍 1.1示例介绍 (OnlineExamination在线考试系统介绍) 1.2分析.建模 (对真实业务进行分析.模型化) 1.2.1 用例分析 (提取系统的所有功能需求) 1.3系统设计.建模 (技术化业务模型) 1.3.1 枚举类型的使用 (别让枚举类型成为数值型对象) 1.3.2 基础数据.业务数据 (显示实体和隐式过程) 1.3.3 模型在数据库中的主外键关联问题 (面向对象模型与关系模型的天然抗阻) 1.3.4 角色.类型 (区分类型与面向对象概念) 1.3.5 名词