服务层和领域模型层有什么区别?

29
例如,我有一个用户表,为了分层,我创建了这样的POJO:

UserEntity.java
UserDao.java
UserBO.java (业务对象、领域模型?)
UserService.java (用于服务层)

UserBO.java和UserService.java有什么区别?为什么我们要将它们分开成两个对象?

2
业务对象可以简单地包含原始状态(字符串、布尔值和数字)。服务类对这些对象执行操作。 - Sotirios Delimanolis
2
一般来说,业务对象是名词,服务方法是动词。服务方法通常实现涉及一个或多个业务对象的某个特定过程或步骤的操作。 - chrylis -cautiouslyoptimistic-
这是一篇非常好的文章,我发现它很有用。http://www.infoq.com/articles/ddd-in-practice - RP-
2
请参见https://dev59.com/CnA65IYBdhLWcg3wrgsa。 - Raedwald
1
请参见https://dev59.com/4HE95IYBdhLWcg3wd9xK。 - Raedwald
3个回答

17

领域模型包含与用户身份相关的信息和功能。它应该在概念上映射到现实世界中存在的物体或问题空间中明确定义的概念。

服务包含与执行原子工作相关的信息和功能。它应该在概念上映射到由领域模型的成员执行的任务。单击应用程序中的按钮执行的单个原子任务通常涉及许多领域成员共同合作,除非您的应用程序只是一个 CRUD-y 电子文件柜。


2
顺便提一下,USER 是一个有点尴尬的例子,因为除非你要实现类似 SAML 引擎之类的东西,否则用户记录实际上更多地属于系统元数据领域,而不是域的实际部分。 - Affe

8
实体:指映射到问题域中某种实体(=感兴趣的对象)的内容。在某些情况下(DDD),有着丰富领域模型的实体具有可以操作模型状态的方法。更为保守的方法是使其贫血(除了getter和setter之外没有任何方法)。通常,实体类最终会被映射到数据库表。
BO:我猜这是某种数据传输对象。有些人非常关心将对实体的访问限制在应用程序的有限部分,并喜欢将数据从实体复制到DTO中。因此,服务可能会从DAO接收实体,然后将其复制到DTO中,并将该DTO返回给服务的调用者。
数据访问对象提供了一种查询或更新数据的方法,它可以具有返回实体或实体集合的查询方法。DAO通常不定义数据库事务,而是由服务执行。
服务是执行某些任务的内容,例如不同的用例通常无法沿实体线清晰地分解。此外,服务通常涉及到实体试图避免的依赖项(因为领域模型涉及建模状态和状态变化,而依赖项涉及基础设施)。一个服务可能有实现某个用户用例的方法,其中每个方法都是事务性的。

2
也许这是一个过高层次的概述,但以下是我以前处理分层的方式,与传统的N层架构基本一致。
Web - 用户浏览器和服务层之间的接口,将HTTP参数转换为服务层需要的数据。
--- 使用业务对象在这些层之间通信 ---
Service - Web层和DAO层之间的接口,这里没有特定的传输协议,即没有HTTP请求/参数,在您的情况下使用业务对象。所有业务逻辑都驻留在此处。例如,如果您的Web层说“将权限1授予用户1234”,则您的服务层将把权限1转换为READ,并将用户1234转换为支持其的UserEntity在数据库中。
--- 使用实体在这些层之间通信 ---
DAO - 服务层和实际持久性机制之间的接口,应尽可能愚笨,这意味着如果期望“购买”对象具有“用户”对象,则DAO应该同时提供两者,而无需处理查找用户等问题。
使用这种分层方法使得易于单元测试和维护每个层独立于其他层。关于BO的详细说明,最大的好处就是将数据从前端获取并封装在一个单一的对象中,它将实际DB条目的查找留给了服务层。希望对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接