`
pengpenglin
  • 浏览: 1567 次
  • 来自: ...
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

一个基于Domain Event的分层架构思考

阅读更多

最近在对之前做过的一个项目进行二期修改。鉴于之前典型的贫血结构,以及Controller--->Service--->DAO模式让代码压力都集中在service层的情况。在参考了网上几篇对象职责和Domain Event的文章后,我也试着捣鼓了一下新的分层模式。贴出来和大家讨论,欢迎拍砖!

【1】层次划分:

①控制层:数据映射、控制转向、业务调用
②业务层:从用户角度出发,看到的系统可以提供的功能接口
③实体层:包含了数据与行为的实体对象
④服务层:从程序内部角度出发,为了完成业务而划分出来的细粒度功能模块
⑤仓储层:对象的构建、缓存、持久化

上面我的说法可能不是很规范,因为DDD也没有仔细的研究,可能大家会对业务和服务层的直至有所疑惑:这里我的想法就是一个从用户角度出发的业务操作,对应到程序内部可能会被划分成多个细粒度的程序操作。

【2】协作关系:

①控制层与业务层:
 ※控制层提供业务层所需的原始,未经封装的数据
 ※控制层提供业务调用
 ※业务层返回给控制层业务出来结果,由控制层决定转向

②业务层与实体层:
 ※业务层在必要时(new,edit,delete等一系列命令操作),从仓储中加载对象
 ※业务层向实体层对象发出事件通知
 ※业务层接收实体的行为反馈

③实体与服务层:
 ※实体通过“服务注册”的方式,让实体具有“自我数据操纵”的能力
 ※实体接受到业务层的事件通知后,广播给注册的服务提供者
 ※服务层为需要提供服务的实体提供相应的操作功能
 ※实体层中包含了实体逻辑(可以自己处理而不需要依赖其他模块、层次)
 ※服务层中包含了服务逻辑(无法通过一个对象自身完成,涉及到其它对象)

④业务与服务层:
 ※当业务要求是查询要求,或者与特点对象无关时,业务层直接请求服务层
 ※服务层可以看成是对业务层请求的内部实现

⑤服务层与仓储层:
 ※仓储层的对象实体可以是:新建,缓存,从持久化介质中加载
 ※仓储层中包含了构建对象的Builder,否则构建和校验
 ※仓储层中包含了对象的缓存和缓存操作
 ※仓储层中包含了对持久层的访问

⑥实体与仓储层:
 ※仓储层构建的最终对象就是实体,仓储是实体的来源,也是实体最终的去向

下面分为两只情况来阐述协作流程:

【3】增删改请求的协作流程




【4】查询请求的协作流程

【5】疑惑与担忧

 

目前还有几个问题一直困扰着我


①这种分层是否合理?因为我想让对象通过事件来消除和服务层的耦合?
②这种把命令、查询分开来对待的做法会不会令日后的逻辑变得分散而难以维护?
③对于这种分层模式,事务控制应该是在业务层还是服务层?

④缓存与对象构建放在仓储中是否合适?

欢迎大家讨论~~

 

分享到:
评论
14 楼 沙舟狼客 2011-03-23  
其实这种模式最大的缺点就是对于Java异常的处理特不方便!
13 楼 cheng1977 2011-03-16  
参考论坛里之前的一篇贴子,再思考下http://www.iteye.com/topic/283668
12 楼 coollzh 2011-03-11  
按Eric的DDD书里说的,DDD只有领域层和服务层,没有业务层一层一说,服务 层上面应该就是应用层了。由应用负责对外提供服务。
11 楼 spawnyy 2010-12-07  
,哥们我看过你在JDON的文章,文章内容都一样啊,面向事件驱动开发
10 楼 seele 2010-12-07  
Controller--->Service--->DAO

Controller 写的代码流程能够根据Service的方法名快速的理解该访问需要执行的流程,就是实际的业务流程

Service 根据传入的参数进行业务方法编写,可以让别的业务功能进行重用

DAO 尽量避免业务上的操作,只进行单一实体的操作,多实体间的查询

如:

LoginController
boolean result = LoginService.queryUser(username,password);
if(result) LoginService.queryMenu(username);
else "跳转到密码错误页面等";

9 楼 gddzmr 2010-11-22  
层次分的很清楚,不过楼主这样分的目的是什么,如果是为了分担service层,那可能就要考虑部署的问题,将业务层和service层进行分开部署吗?是实际上业务层与service层的主要区别就是是否可公用。但并不能分担服务器的压力,因为往往业务层与服务层部署在同一台服务器上,很难分开部署。该种分层的结构是合理的,事物处理一定要放在业务层,控制层不可直接调用服务层,服务层的目的是为了给业务层提供服务。实体层的设计可以详细一些。
8 楼 hanzhicheng754 2010-10-19  
难不成楼主的二次维护就是要把一期工程的工作全部推倒重来?不要为了DDD而DDD
7 楼 mwmw 2010-03-25  
实用就好了,没有必要生搬硬套。
6 楼 zcq100 2010-03-25  
中间层细分为业务层和服务层,实际应用的时候怎么有效区分呢?会不会导致这两层混乱?
5 楼 seele 2010-03-25  
看不太明白。。能否上个代码看看,是什么样写的
4 楼 phenom 2010-03-25  
层是分了好多,服务是无状态的,它不涉及业务回逻辑,是为了分担领域对象的职责而出现的.因为这些职责不是实体,也不是值对象应该拥有的.
这三个领域对象是模型的核心.
实体作为了聚合根是一次性装载全部属性(包括聚合的其它值对象或实体),这个通过工厂处理,而到存储里找到相应的对象.
添加,删除这肯定是要和数据库关联的.之前看到一些是将查询和添加分开.添加不经过存储添加,而是添加后再放到存储里.而查询所有都经过它.
书里说对数据库或其它存储介质的访问都通过Repository来处理 .不过事务确实比较麻烦.如果 在这里实现事务处理,当外界服务调用时可能跨越了多个实体的改变,应该如何处理呢?
也许是OO思想还差远了,我还不能处理.
3 楼 skydream 2010-03-24  
①控制层:数据映射、控制转向、业务调用
②业务层:从用户角度出发,看到的系统可以提供的功能接口
③实体层:包含了数据与行为的实体对象
④服务层:从程序内部角度出发,为了完成业务而划分出来的细粒度功能模块
⑤仓储层:对象的构建、缓存、持久化

这里的实体层买有看明白,你说的应该是一些和实体相关的value object或者说javabean吧?这个应该不算是层吧?
2 楼 skydream 2010-03-24  
强烈支持业务层和服务层分开的想法,业务层和服务层应该分别针对业务逻辑和实现逻辑,彼此独立,千万不要彼此交叉。而且service的力度最好能稍微小一点,方便业务层组合多个service来实现新的业务逻辑。
1 楼 power1128 2010-03-24  
发表下我的看法:
1.这种分层显得更清晰。尤其是业务层和服务层分开。服务器层更加应该侧重实体对象的服务功能,比如添加一个订单;业务层则更面向表现层的需求。比如用户可以同时添加1个或者多个订单。展示的方式不同,添加订单的业务操作就可能不一样。
2.我自己现在都是用一个查询service来完成所有查询操作的。
3.应该放在业务层。就像我上面说的,一次添加多个订单,可能是要求保证数据完整性的。一个业务可能需要好几个服务来完成。
4.缓存肯定是放在仓储中的。至于对象的创建,和你有点不太一样。我现在是在表现层通过dto的方式,将数据传给service,在service中完成实体对象的创建,再将dto中的数据赋值给实体对象。我感觉这样有一个最大的好处就是对表现层简单了,他只用管理dto对象,不用关心实体对象,也屏蔽了实体对象的实现方式。比如你要修改一个订单,如果用在表现层操作实体对象,那么表现层这时就必须去服务层先load这个实体对象,然后修改值,再传给服务器层update。这实际上load实体对象是没有必要的。如果我用dto,那么就在表现层直接new一个dto对象,设置好值以后传给服务层,这时候服务器再来update实体对象。而且服务层针对dto进行服务,感觉有点别扭。如果加上一个业务层,就更好了,业务层针对dto对象提供业务服务,服务层针对实体对象提供服务。当然这样多引入一层,编码上就变得更麻烦了。呵呵

相关推荐

    DDD分层架构的三种模式.

    六层架构模式在五层架构的基础上增加了一个 Framework 层,用于提供基础设施服务和工具。这使得系统更加完善和可靠。 在这篇文章中,我们讨论了 DDD 分层架构的三种模式:四层架构、五层架构和六层架构。每种模式都...

    DDD分层架构参考代码目录结构

    每个微服务可以看作是一个独立的业务领域,拥有自己的用户接口层、应用层、领域层和基础层。微服务的一级目录结构通常按照DDD的四层模型划分,如interfaces、application、domain和infrastructure。 在接口层,...

    分层架构与业务逻辑实现方式

    想一想,我们在业务层实现一个业务时,一般就是这么做的,要实现一个什么功能,在脑子里想一想,然后找到那个对应的类,然后再定义一个方法,加上一堆参数。就开始写这个方法的实现代码,要是逻辑复杂点,这方法里一...

    领域驱动(DDD)充血模式下,domain 与 Service以及Repository的解耦---DOMAIN EVENT

    在充血模式下,订单实体(Order)可以直接发布一个“订单状态改变”事件,而不是调用库存服务。库存服务的监听器接收到这个事件后,再进行库存的更新操作。这样,订单实体和库存服务之间的依赖关系就被解除了。 ...

    Spring Data的Domain Event的用法详解

    摘要:本文主要介绍了Spring Data的Domain Event的用法详解,通过对Domain Event的概念、aggregate的概念、Domain Event的发布和处理等方面的详细讲解,旨在帮助读者深入了解Spring Data Domain Event的使用方法和...

    .NET分层架构_第3章上机练习.zip

    例如,一个在线商店可能有Product、Order和Customer等实体。领域模型层定义了这些实体的属性和行为。 在“chapter3”这个文件夹中,很可能是包含了一系列与.NET分层架构相关的练习,如创建各个层的项目、编写接口和...

    EMC Data Domain架构体系.docx

    ### EMC Data Domain 架构体系解析 #### 一、概述 EMC Data Domain 是一款业界领先的数据保护存储设备,以其高效的数据消重能力和强大的数据保护功能而闻名。本篇文章将深入探讨EMC Data Domain 的核心架构——...

    学生成绩管理系统(七层架构)

    学生成绩管理系统是一款基于asp.net技术开发的软件应用,它采用了七层架构设计,旨在提供高效、稳定且可扩展的教育信息化解决方案。在深入探讨这个系统之前,我们首先要理解七层架构的概念及其在系统开发中的作用。 ...

    domain-event-master.rar

    总结,"domain-event-master.rar"是一个宝贵的资源,它结合理论与实践,为开发者提供了一个深入理解并掌握领域驱动设计和事件驱动模式的平台。通过深入研究和实践其中的源码,开发者能够提升自己的软件设计能力,...

    基于 DDD、EventSourcing 的现代响应式 CQRS 架构微服务开发框架

    每当我们对系统进行操作时,都会生成一个事件,这些事件按时间顺序保存,可以随时回溯以重建系统的完整历史。事件溯源有利于审计追踪、故障排查和系统恢复,尤其适合那些需要长期保留历史数据的应用。 命令查询职责...

    详细介绍ApplicationDomain和SecurityDomain

    - 当一个新的SWF文件被加载到Flash Player中时,会为其创建一个新的ApplicationDomain。 - 这个新的应用程序域会继承自它的父应用程序域。因此,如果父应用程序域中有共享的类或资源,那么子应用程序域中的SWF文件也...

    [我的软考作文]论基于DSSA的软件架构设计与应用+我的分析.pdf

    在本项目中,我们的小组成员根据领域模型,设计了一个基于DSSA的软件架构,包括领域模型、参考需求、参考架构等。 三、领域实现 领域实现是DSSA中的最后一步骤,它旨在根据领域模型和DSSA,开发和组织、重用信息。...

    基于DDD和微服务中台架构与实现

    【基于DDD和微服务的中台架构与实现】是一本深度探讨现代企业IT架构的书籍,作者欧创新和邓頔结合实践经验,阐述了如何利用领域驱动设计(DDD)和微服务架构构建灵活且高效的中台系统。以下是该书涉及的主要知识点:...

    DDD 领域驱动设计 架构(分层六边形RESTful).docx

    六边形架构依据领域分层的模型,在应用层和领域层内置后,一个典型的六边形架构应用有两个端口,一个端口对应用户接口层,用于应用把握,一个对应数据访问层,用于数据猎取和长久化。 RESTful 架构 REST...

    深入理解ApplicationDomain和SecurityDomain

    每个SWF文件都关联到一个特定的安全域,这个安全域通常基于该文件的来源域名。例如,来自`senocular.com`的SWF文件将关联到一个名为`senocular.com`的安全域,而来自`example.com`的SWF文件将关联到一个名为`example...

    Domain driven design-quickly

    - **实体(Entity)**:领域模型中的一个对象,它不是通过属性定义,而是通过一个连续的、唯一标识符定义。 - **值对象(Value Object)**:用来描述实体的特征,不具有唯一标识符,不可变,当其所有属性值都相等时...

    smart-lottery抽奖系统基于COLA架构采用DDD领域驱动中四层架构

    SpringBoot则是基于Spring框架的一个微服务开发工具,简化了Spring应用的初始搭建以及开发过程。Java作为广泛使用的后端编程语言,提供了丰富的库和生态系统,是构建大型企业级应用的理想选择。 在"content_code"这...

    domain-event:用于创建DDD应用程序的域层的库

    use GpsLab \ Domain \ Event \ Event ; final class PurchaseOrderCreatedEvent implements Event { private $ customer_id ; private $ create_at ; public function __construct ( CustomerId $ customer_id ,...

    Radar一个基于PHP的ActionDomainResponder实现

    Radar是一个专为PHP开发者设计的Action-Domain-Responder(ADR)框架,它遵循了一种分层架构的设计模式,旨在提高代码的可读性、可维护性和可测试性。Action-Domain-Responder模式是一种软件设计模式,它将应用程序...

    EMC DataDomain操作系统初始配置指南.pdf

    EMC DataDomain操作系统是一个基于Linux的操作系统,专门设计用于数据保护和数据管理。该系统支持多种存储协议,包括CIFS、NFS、VTL等。 2. 初始配置之前的准备工作 在开始配置EMC DataDomain操作系统之前,需要...

Global site tag (gtag.js) - Google Analytics