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

隔离的领域层

阅读更多

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
分享到:
评论
12 楼 wangyonghe 2006-12-25  
当然,里面是有很多东西的,我只是说其中的Action Name,这个Action Name 是业务层的方法(当然也可以采用映射),在进行重构时,字符串表示的方法是不能够被开发工具找到的。
11 楼 shaucle 2006-12-25  
俺是摘自DefaultSaveOrUpdateEventListener
Event 中可以有很多东东啊

session
object;
requestedId;
entityName;
entity;
entry;
resultId;

不应该只有字符串,完全可用多态(如strategy)等进行灵活的设计

俺这里不能下载,只能夸夸其谈,还望谅解.
10 楼 wangyonghe 2006-12-25  
//void onSaveOrUpdate(SaveOrUpdateEvent event)
在Event 中应该包括Action 的名称吧,它代表Domain 中的一个方法,它是Event 中的一个成员,我所说的业务操作是指这个Action 的名称。

使用进行反射时,很难进行单步跟踪。

因为Observer 模式中的Listener 是没有返回值的,也不应该有返回值,你举的例子只是一个简单的方法调用,而不是Listener。

我加了一个附件,里面有我的实现代码,您可以先看看。
9 楼 shaucle 2006-12-25  
//1.业务方法的调用变成了字符串,而非直接调用
为什么不能用对象,如:
void onSaveOrUpdate(SaveOrUpdateEvent event)
//2.业务方法的调用都是通过反射进行调用的,对开发阶段的调试也是比较复杂的。
更用不着了
//3.本模式有个最大的缺陷,界面在进行业务方法调用时,经常需要获取业务方法的返回值,这种模式无法实现,因为Observer 模式中的Listener 无法提供返回值。
为什么不能设返回值?
Serializable performSaveOrUpdate(SaveOrUpdateEvent event)
而且没返回值也不一定代表不好测试啊.(虽然俺也不推荐mock工具)

只是随便举了hibernate里面的例子...
可能与楼主需求不同,还望谅解.
8 楼 wangyonghe 2006-12-25  
lane_cn:哪些模式支持,可以列举一下吗?

业务层的测试应该由业务的单元测试去实现,而不应该由界面进行测试,我们虽然最关心业务层,但是界面的重要性也不能忽视。
如果由界面去触发业务层的测试,会使业务层的开发变得很被动,也不利于业务层的开发。
界面去触发业务层应该属于集成测试,可以在单元测试以后进行。
7 楼 wangyonghe 2006-12-25  
本模式有个最大的缺陷,界面在进行业务方法调用时,经常需要获取业务方法的返回值,这种模式无法实现,因为Observer 模式中的Listener 无法提供返回值。
解决方案还在思考中,如果哪位网友有好的解决方法可以Share 一下。
6 楼 lane_cn 2006-12-25  
这样的框架我见多了,都是把业务层隔离开了,据说是开发简便,易于测试。结果是最后一看,他们测试的都不是业务层。
不测试业务层,搞unit测试有什么意义。所谓解耦,首先是业务层不能依赖其他层次,其次是不同的业务概念之间不应该互相依赖。最终我们关心的是业务层,测试这个层次,才能保证系统可以迭代开发,满足变化的需求。
业务层的输入参数、输出参数和异常都应该是业务对象,这样就明确了代码的业务含义,这是业务层的任务。
5 楼 wangyonghe 2006-12-25  
它的复杂性主要体现在两个方面:
1.业务方法的调用变成了字符串,而非直接调用,这样对后期的维护会很复杂,因为通过开发工具不能够找到某个业务方法被谁调用,在Refactor 时也会出现问题。
2.业务方法的调用都是通过反射进行调用的,对开发阶段的调试也是比较复杂的。
4 楼 shaucle 2006-12-25  
wangyonghe 写道
这样做当然可以实现松散耦合,但是也会使程序变得复杂,我正在应用该模式,如果哪位应用过可以共享一下。



俺倒是不这么认为,很多时候会更使程序模块更清晰,
当然很简单的逻辑没必要
3 楼 wangyonghe 2006-12-25  
这样做当然可以实现松散耦合,但是也会使程序变得复杂,我正在应用该模式,如果哪位应用过可以共享一下。
2 楼 shaucle 2006-12-25  
不错啊,事件驱动,可更大程度地实现松散偶合.

hibernate就是这么做的.
1 楼 wangyonghe 2006-12-24  
没有人关心吗?如果有意见的可以提呀?

相关推荐

    《领域驱动设计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