




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
以前做了个简单的论坛但是之前的版本都没有考虑过架构设计。所以想在第三个版本中应用分层架构DDDEDA架构重新设计一下我的论坛。经过半年的努力终于整出了一个让自己比较满意的架构了但是也仅仅是一个Demo还不能真正使用但对于说明架构设计已经足矣。源代码下载地址/netfocus/ProductName.rar 由于本人接触领域驱动设计的时间还很短对于如何设计领域对象还没有丰富的经验。所以我希望大家看了我的源代码中的领域层中的领域对象后不要笑话我呵呵。因为我本文主要想向大家展示的是我对分层架构的思考和自己的想法我想大家自己的想法才是最重要的吧我本人也很注重思想、思考不要老是讨论别人的老外的架构有多好多好我们要有自己的思想。所以大家在看我文章和源代码时不能过分专注于一点上而应该从总体上来看待。 开发工具Visual Studio 2010 项目结构图 说明 1关于项目的命名规则。假设现在有一个公司要做一个项目我觉得比较好的项目命名方式为以CompanyName.ProductName作为前缀基础类库命名为Common产品中的某个子应用模块则可以命名为CompanyName.ProductName.Modules.ForumCompanyName.ProductName.Modules.Blog等。然后每个模块还可以根据模块的分层设计分出不同的Project比如论坛的应用层可以命名为CompanyName.ProductName.Modules.Forum.ApplicationService等。由于我做的只是一个展示架构的Demo所以没有用具体的CompanyNameProductName。我觉得在开发阶段我们可以不使用最后的名字到了最后项目快完成时再做统一全局替换即可。 2架构设计介绍。 一个经典的基于领域驱动设计Domain Driven Design 的应用分为下面的层次 我的项目也同样采用上面的分层架构对于上面每一层的功能和职责我想大家应该都比较清楚了。我主要想和大家分享一下基于这样的分层架构下我的实现方式 先来看一下各个层中包含的主要元素。 说明 界面层User Interface or Presentation Layer没有什么特别的因为我是采用ASP.NET MVC来最为界面层所以会包含Page、Control、Controller、View ObjectVO。前三个大家都很熟了至于View Object相当于Page或Control的Model负责提供数据给界面以及保存界面录入的数据。View Object还有一个很重要的功能就是会对界面提交的数据做简单的数据有效性验证但不会包含任何的业务逻辑验证。任何业务逻辑验证会由领域层来完成。界面层只会和应用层或基础层打交到不会和领域层有任何关系。界面层的任何查询或行为都通过应用层实现界面层通过构建应用层中的某个Request然后发送到应用层应用层完成相应操作或查询后返回一个Reply给界面层。如果是查询的操作则Reply中会包含一个或多个DTO界面层将DTO转换为VO然后显示。 应用层Application Layer真正意义上的非常薄的一层该层由一些应用服务来完成所有功能。为了性能方面的考虑在学习了命令查询职责分离Command Query Responsibility SeparationCQRS的思想后我觉得应该将查询和命令的实现分离这样可以对这两部分更好的进行单独设计。因此在我的实现中对于查询的Request会委托给一个专门负责查询的服务去完成对于命令的Request会委托给一个专门负责处理命令的领域服务去完成。另外只要是有命令处理的请求就会最终用事务的方式来提交所有的修改 领域层Domain Layer我设计的最具特色的一层。大家知道经典的领域驱动设计领域层会包含领域服务、实体、值对象、聚合根、工厂仓储这些概念。但是在我看了一些资料和自己独立思考后发现用这样的方式来组织领域逻辑在我看来不是太好因为1整个模型没有体现出事物的相互协作的特性也就是没有消息机制2用不太自然的方式来组织相互作用的各个实体比如Aggregate的概念在我看来就是一个不该有的概念。在真实的世界中我认为最好的软件就是我们自己那就是“人类”。想想看人类是亿万年才进化出来的地球上最高级的生物他的内部结构绝对是一个非常好的”软件“。大家都知道人有大脑、皮肤、细胞、神经元。如果把人和一个领域模型想比较那么人的皮肤相当于领域模型暴露给外面的Domain Service人的细胞相当于领域模型中的各个Domain Entity人的大脑相当于领域模型的一个”中央事件处理器“Event Bus人的神经元相当于领域模型中的各种消息Domain Event也就是说一个真正的符合客观实际的领域模型应该包含Domain ServiceDomain EntityDomain EventEvent Bus四个元素。不需要其他任何概念。 需要特别指出的是 1所有的Entity是独立的相互平等的没有什么聚合Aggregate的概念也就没有Aggregate Root的概念。所有的Entity之间的交互应该总是通过Event来完成。而不应该通过对象引用的方式来达到相互协作的目的。以前大家都以为面向对象编程就一定要让对象之间相互引用。大家想想为什么我们要让对象之间相互引用目的很简单就是能让对象相互影响相互协作。那难道就没有其他方法可以达到此目的吗当然不是我们可以用事件也就是用通知和响应的方式。我认为对象引用或者说调用其他对象的方法是造成对象之间耦合的根本原因。而用发送事件和响应事件的方式才是真正体现事物交互的本质联系比如我们人类如果我狠狠的掐你一下你可能会疼的跳起来可能嘴巴还会撅起来。真个过程可以描述为皮肤接受到外界刺激传递到大脑大脑作出反应当然有时可能是条件反射通知肌体其他部位作出相应反应跳起来撅嘴巴。另外任何一个Entity都具有发送事件和处理其关心的事件的能力所有的业务逻辑验证都应该在Entity中实现如果一个Entity不能实现的验证则会通过发送消息让多个Entity协作完成验证。 2领域服务应该非常的薄它只需要做一件事情那就是发送事件给事件处理器仅此而已它相当于一个圆球的表明而里面包含的各个相互作用的实体。就如同人类的皮肤一样人的皮肤也很薄。这点和经典的领域驱动设计中的领域服务也完全不相同。经典的领域驱动设计中的领域服务的职责是处理那些需要多个实体合起来才能完成的事情比如银行转账。 3中央事件处理器其功能应该和人类的大脑一样应该很聪明它应该知道任何一个事件该怎么处理。也就是说它会知道该通知哪些实体去完成所有的响应操作。这个功能类似于事件驱动架构Event Driven ArchitectureEDA中的Event Bus。 4整个领域层应该是持久化透明的也就是说不需要关心Entity的修改是如何被持久化到数据库的。所有的对象只需要关心自己的感兴趣的事件并处理之修改自己的状态。仅此而已。 基础层Infrastructure Layer 和我们平时常说的基础层类似包含一些抽象的接口或底
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 手动变速箱转让协议合同
- 2025年精神科心理治疗方法应用模拟测试卷答案及解析
- 2025年度大型活动临时服务人员聘用合同
- 2025版婴幼儿专用奶粉全国连锁加盟经营合同
- 2025版商砼行业市场调研与数据分析合同
- 2025版高新技术企业委托报关代理合同
- 2025版安全挖机工程承包合同范本发布
- 2025版恋爱期间双方生活品质提升协议书
- 无产权房屋赠与合同范本
- 林地流转合同解除协议书
- 医疗器械供货合同正式版
- 人教版七年级英语下册阅读专项训练60篇-含答案
- 人工智能在检验医学中的应用
- 范里安-微观经济学:现代观点
- 【江苏洋河股份内部控制环境现状、问题及对策12000字(论文)】
- 小学语文课外补充古诗词
- 人教版数学四年级上册教材课后习题参考答案(全)
- 人力资源员工旅游活动方案
- 《大卫科波菲尔》读书分享名著导读PPT
- 日照市东港区禹海红旗海水鱼工厂化循环水养殖与良种繁育示范项目海域使用论证报告书
- 北师大版四年级下册口算题大全(全册完整)
评论
0/150
提交评论