`
wangyonghe
  • 浏览: 43293 次
社区版块
存档分类
最新评论

隔离的领域层

阅读更多

1. 目的

    将业务层的方法调用,变成非显式调用,有利于界面的自动化测试。

2. 动机

    在编写客户端代码的时候,很多Action 都是直接调用业务层方法(或者通过Presenter 负责调用),这样就会使界面的代码直接依赖业务层代码,在进行单元测试的时候会为业务层接口打很多的桩,工作量较大。而且界面的单元测试,主要是测试界面的布局、界面的逻辑和用户响应等,在单元测试阶段很少会涉及业务的逻辑。

3. 参与者

    1, Presentation: 主要负责界面的展现和用户操作的接受。

    2. Presenter: 主要负责用户的界面操作,转发用户的业务操作。

    3. Domain Binder: 主要负责连接表现层和领域逻辑层。

    4. Domain Accessor: 主要负责领域逻辑层的访问。

    5. Domain Logic: 主要负责处理业务逻辑。

4. 协作

   

说明:   

    1.图中的虚线为非显式调用;

    2.图中的实线为直接方法调用;

5. 实现

    实现流程图如下:

 

    由于只能加3个附件,所以其它流程图不能够加进来,具体可能参见源代码吗?

5. 结果

    表现层不直接依赖领域层,用户在进行业务操作时,Presenter 会将业务操作封装成一个Domain Event 发到Domain Accessor。 Domain Event 封装了操作的类型和参数。当系统需要多客户端同步时,Domain Accessor 会接收到领域层发来的事件,然后再将该事件转换成Domain Event 发出去,表现层会收到事件然后作相应的处理。

6. 特点

    优点:该模式有利于界面的单元测试或自动化测试,也使开发界面的人不关心业务逻辑,开发业务逻辑的人不关心界面,有利于合理的分工;

    缺点:用户操作被抽象成一个Domain Event,会使结构变的复杂,很难被理解。

7. 感谢

    感谢shaucle和BirdGu,他们提供了很多建设性的意见。

  • 大小: 10.8 KB
  • 大小: 20.1 KB
分享到:
评论
32 楼 wangyonghe 2006-12-27  
我的目的有三方面:
1) 在做UI 单元测试的时候,不需要为Domain 写Mock。
2) 多客户端的数据同步,协作图中的Domain Binder 就是起这个作用,UI 层操作的对象可以发给Domain 层,Domain 层的操作的对象可以发给UI 层,这样就不需要每个模式块自己写同步的代码了。
3) 使客户端代码和业务层代码完全分开,这样也有利于项目组内进行分工。
31 楼 partech 2006-12-26  
wangyonghe 写道
如果使用Mock,那就不应该称为隔离了。
我的目的是UI 层和Domain 层没有直接的方法调用。

嗯,不知道你的这种选择是基于什么考虑,如果是中小型应用,我看不出这样做有什么好处,UI层依赖Domain层再自然不过了。
如果是较复杂的中大型应用,在中间添加DTO不失为一个方法,因为这样的应用UI需要的数据和Domain层通常没有那么简单的一一映射,这种Domain对象到UI平面数据的转化会大大的简化UI的操作,同时也使UI相对独立于Domain层,反之亦然。
30 楼 lane_cn 2006-12-26  
wangyonghe 写道
我的目的是UI 层和Domain 层没有直接的方法调用。

如果你做到了这一点,你的系统将很难开发,也很难维护。总之你是在找麻烦。
如果你希望做到Domain层对上不依赖UI,对下不依赖数据层,这是十分有好处的,也是比较符合实际的。
29 楼 wangyonghe 2006-12-26  
如果使用Mock,那就不应该称为隔离了。
我的目的是UI 层和Domain 层没有直接的方法调用。
28 楼 partech 2006-12-26  
看了半天没看明白。
正如BirdGu所说,在service接口后面提供mock,不就隔离了领域层了么?
27 楼 lane_cn 2006-12-26  
软件设计是一件很自然的事情,大部分情况都可以用常识来解决,不要搞得太别扭。
要说模式,软件所有的模式都可以归结到一个模式上:层次模式。
老老实实的把业务层写出来,把业务对象原原本本的造出来,比一大堆花哨的模式有效多了。
软件的价值在于实现业务流程的自动化,需求的变更也都是从业务层开始的。业务的复杂度是软件必然无法逃避的。
26 楼 wangyonghe 2006-12-26  
如果UI层给Domain层的是Commnad,而Domain 层给UI 层的是Event,那么我的DomainBinder 就没有什么意义了。它们肯定是一种类型。

Command 代表着主动发起的含义,Domain 层发给UI层时使用Command 肯定不合适。UI 层发给Domain 层使用Commnad 还可以接受,我再想想
25 楼 wangyonghe 2006-12-26  
如果UI层给Domain层的是Commnad,而Domain 层给UI 层的是Event,那么我的DomainBinder 就没有什么意义了。它们肯定是一种类型。

Command 代表着主动发起的含义,Domain 层发给UI层时使用Command 肯定不合适。UI 层发给Domain 层使用Commnad 还可以接受,我再想想
24 楼 BirdGu 2006-12-25  
shaucle 写道
//把业务操作抽象成Event可能不太直观,抽象成Command比较容易理解

Event和Command本质上是相似的,都是发一个Event(Action)出去,完成一系列的事情.反正对于前台就是这么个表象.

俺有次做个类似的项目(不同cms系统的文件导入问题),名字不知道用Command还是用stategy,最后干脆就用action,看着还蛮舒服.呵呵.


合理的隐喻对于理解系统架构,有时还是很重要的。
23 楼 BirdGu 2006-12-25  
wangyonghe 写道
我认为用Command 不是很合适,因为DomainEvent 不仅仅是从UI 层发向Domain 层,Domain 层也可以发送其它客户端产生的Domain 事件。
如果使用Command,好像只是从UI 层发向Domain 层的命令,不够全面。
大家还有其它意见吗?


我以前就是这样做的,UI把Command给Server,Server再把Command转给其他客户,只是Command在不同的地方有不同的执行逻辑。不同的接收者接到同一个Command作出不同的反应,这也很自然。

另外,如果UI给Server的数据和Server给其他客户端的数据有很大不同的话,那么也可以考虑UI给Server Command, Server再给其它客户端Event,Command和Event可以是完全不同的对象。当然,这个要视应用的具体情况来定。
22 楼 wangyonghe 2006-12-25  
我认为用Command 不是很合适,因为DomainEvent 不仅仅是从UI 层发向Domain 层,Domain 层也可以发送其它客户端产生的Domain 事件。
如果使用Command,好像只是从UI 层发向Domain 层的命令,不够全面。
大家还有其它意见吗?
21 楼 shaucle 2006-12-25  
//把业务操作抽象成Event可能不太直观,抽象成Command比较容易理解

Event和Command本质上是相似的,都是发一个Event(Action)出去,完成一系列的事情.反正对于前台就是这么个表象.

俺有次做个类似的项目(不同cms系统的文件导入问题),名字不知道用Command还是用stategy,最后干脆就用action,看着还蛮舒服.呵呵.
20 楼 BirdGu 2006-12-25  
如果是为了表现层和业务逻辑层的解耦,那么只要做到Code to interface就够了。做表现层的单元测试时,用Mock代替业务逻辑层也不麻烦啊。

如果是为了在多客户端之间做数据同步,那么就考虑Observer和Command模式。

把业务操作抽象成Event可能不太直观,抽象成Command比较容易理解。
19 楼 wangyonghe 2006-12-25  
BirdGu: 可有联系方式,可以留下吗?
18 楼 wangyonghe 2006-12-25  
我看了一下Hibernate 的实现,再研究一下......
17 楼 wangyonghe 2006-12-25  
BirdGu:
当然,我现在也是在Swing 中进行试验。
16 楼 shaucle 2006-12-25  
它就是在event上作文章.
saveEventListener[i].onSaveOrUpdate(event);
return event.getResultId();//这就是save返回的对象
所以俺说没返回值不一定不好测试,你可以通过判断某些对象(如event)的值来达到相同目的.

15 楼 BirdGu 2006-12-25  
以前做网管软件的时候用过这样的模式,当时的客户端是用Swing的Rich client,用这种模式的目的是多客户端的数据同步。

在Web应用中这么做值得吗?
14 楼 wangyonghe 2006-12-25  
我能理解你的意思,它是通过Event 的类型来区别具体的操作。
但是业务领域的操作是很难被抽象成各个不同的Event,所以必须使用字符来标识。
另外,它的fireSaveOrUpdate 方法也没有返回值,我不知道返回值在Hibernate 中是如何解决的。
例如:在添加对象时,我需要返回被添加的这个对象,它的fire 方法是如何实现的。
13 楼 shaucle 2006-12-25  
	public void saveOrUpdate(String entityName, Object obj) throws HibernateException {
		fireSaveOrUpdate( new SaveOrUpdateEvent(entityName, obj, this) );
	}

这里的entityName一般用不上,也就是说其Event里包装的主要是Object和this,
如一般的save(Object)会调用
public void saveOrUpdate(Object object) throws HibernateException {
saveOrUpdate(null, object);
}

相关推荐

    《领域驱动设计C# 2008实现问题.设计.解决方案》.((美)Tim McCarthy) [PDF](0520_).rar

    7. **仓储模式**:仓储负责与持久化存储交互,隔离领域层和数据访问层。在C#中,仓储通常是一个接口,实现该接口的类负责实际的数据存取操作。 8. **上下文边界**:DDD强调明确界定上下文,每个领域模型都有其特定...

    《领域驱动设计C# 2008实现问题.设计.解决方案》.((美)Tim McCarthy) [PDF]__(0521).rar

    3. **仓储**(Repository):仓储模式是DDD中用于隔离领域层和数据访问层的接口,它提供了一种抽象的数据访问方式,使得领域模型可以独立于具体的数据库技术。 4. **上下文**(Bounded Context):DDD强调在明确...

    dddbook-master.zip

    6. **仓储**(Repository):负责数据的持久化操作,隔离领域层与数据访问层。 7. **界面对话**(UI或Controllers):可能是Web界面或API,用于用户交互。 8. **测试**:包括单元测试和集成测试,确保代码的质量和...

    单纯的DDD代码

    7. **仓储(Repository)**:提供类似于集合的接口,负责领域对象的持久化操作,隔离领域层与数据访问层。 8. **领域服务(Domain Service)**:当业务逻辑无法通过实体和值对象的交互完成时,可以引入领域服务来...

    行业资料-建筑装置-带隔离干爽层的纸尿裤.zip

    文件"带隔离干爽层的纸尿裤.pdf"虽然名字奇特,但可以推测内容可能涉及了建筑领域中类似纸尿裤材料的创新,可能是关于新型防水材料的研发、应用案例,或者是对现有技术的改进。阅读这份资料,我们可以获取更多关于...

    基础电子中的无静电隔离层的变压器代替有静电隔离层的变压器

    在基础电子领域,变压器是电路设计中不可或缺的元件,它主要负责电压的转换、电气隔离以及信号的耦合。在音响设备中,由于对音质的高要求,通常需要使用带有静电隔离层的变压器,以避免电网中的噪声和其他杂波通过...

    隔离层工程检验批质量验收记录.rar

    隔离层工程是建筑工程中的一个重要环节,它主要用于保护建筑物主体结构免受水分、腐蚀物质以及其他环境因素的侵害。在施工过程中,隔离层的质量控制至关重要,因为它直接影响到建筑物的耐久性和安全性。"隔离层工程...

    TI隔离芯片资料.p

    - **特点**:通过变化的磁场在隔离层上传输信息。 - **问题**:噪声和信号频率可能会重叠,导致高共模阻抗和低差分阻抗的问题。 - **电容耦合技术**: - **优点**:高效率的能量传输和对磁场的良好抗扰性,适合低...

    行业资料-建筑装置-带防火隔离层现浇混凝土永久性复合保温外模板[1].zip

    综上所述,这份"行业资料-建筑装置-带防火隔离层现浇混凝土永久性复合保温外模板"的压缩包文件,涵盖了建筑领域的创新技术,对建筑设计师、施工人员和行业研究人员来说,都是一份非常有价值的学习和参考资料。...

    交换机高级特性-二层端口隔离

    本篇将深入探讨交换机的高级特性之一——二层端口隔离,以及如何在华为ENSP(Enterprise Network Simulation Platform,企业网络模拟平台)上实现这一功能。 二层端口隔离,也被称为端口隔离组或VLAN隔离,是一种...

    隔离CAN 的实际应用,已经可以使用了

    CAN(Controller Area Network)是一种广泛应用的串行通信协议,尤其在汽车、工业自动化和医疗设备等领域。ISO721是CAN标准的一部分,全称为“ISO 11898-2:2015”,它定义了物理层的规范,包括电气特性、传输介质和...

    行业文档-设计装置-双层或多层钢筋网片隔离固定结构.zip

    此外,隔离措施也避免了不同层次钢筋间的相互干扰,确保每一层都能充分发挥其作用。 在设计双层或多层钢筋网片隔离固定结构时,工程师需要考虑以下几点: 1. 结构分析:根据建筑物的荷载情况和使用功能,进行详细...

    使用数字隔离器对USB实现隔离的方法

    ADI公司的ADuM4160 USB隔离器为实现USB隔离提供了一个创新且成本效益高的解决方案,进一步推动了USB在高要求领域的广泛应用。未来,随着技术的不断进步,我们可以期待更多高效、可靠的USB隔离技术出现,以满足日益...

    利谱隔离卡uefi驱动.zip

    在信息技术领域,安全是至关重要的一个环节,而利谱隔离卡正是为了提供更高层次的安全保障。本文将深入探讨利谱隔离卡的UEFI(统一可扩展固件接口)驱动及其安装过程,帮助用户在Win10系统下顺利设置和使用。 首先...

    profibus总线隔离器(RS485隔离).rar

    标题中的“profibus总线隔离器(RS485隔离)”指的是在工业自动化系统中,用于连接设备的通信协议——Profibus与物理传输层之间的关键组件,即Profibus总线隔离器。它主要功能是将RS485通信网络进行电气隔离,以防止...

    行业文档-设计装置-一种带隔离层的打字蜡纸.zip

    标题提及的“一种带隔离层的打字蜡纸”可能是指一种特殊的技术或设备,它在传统的打字蜡纸上增加了隔离层,以提高打字效果或者解决特定问题。这种设计可能适用于印刷、文档制作、档案保存等领域,尤其在早期的文书...

    数字隔离器选型及应用经验谈

    数字隔离器是一种特殊的电子元件,主要用于隔离电子系统中数字信号与模拟信号之间的传输,确保在信号传递过程中,系统与用户之间存在一个高电阻隔离层,从而达到保护用户及电路系统的安全目的。数字隔离器的选型及...

    行业资料-电子功用-具有隔离柱的多层电路板结构的说明分析.rar

    隔离柱,也被称为支柱或支撑柱,是一种在电路板层数之间提供物理间隔和电气隔离的结构。它们通常由金属材料制成,如铜或不锈钢,有时会镀上金、银等导电材料以增强其导电性和抗氧化性。隔离柱在多层电路板中的作用...

    武汉波仕 USB光电隔离器(隔离2500V).pdf

    BS-USB在软件层面上仅作为一个透明的物理隔离层,与计算机操作系统无关,兼容WindowsXP/2000/Me/98等操作系统。 6. 注意事项 在使用和安装BS-USB产品时,用户应当注意确保设备的正确安装以及适当的驱动程序的安装。...

Global site tag (gtag.js) - Google Analytics