服务层和域模型层之间有什么区别

时间:2014-01-24 18:20:31

标签: java business-objects service-layer domain-model

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

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

UserBO.java和UserService.java之间的区别是什么?为什么我们把它分成两个对象?

3 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:4)

实体:映射到问题域中某种实体(=感兴趣对象)的东西。在某些情况下(DDD),存在丰富的域模型,其中实体具有可以操纵模型状态的方法。更保守的方法是使它们贫血(除了吸气剂和固定剂之外没有任何方法)。通常,Entity类最终会映射到数据库表。

BO:我猜这是某种数据传输对象。有些人非常担心将实体的访问限制在应用程序的有限部分,他们喜欢将实体中的数据复制到DTO中。因此,服务可以从DAO接收实体,然后将其复制到DTO中,并且DTO是服务的呼叫者将返回的内容。

数据访问对象提供了一种查询或更新数据的方法,它可以具有返回实体或实体集合的查询方法。 DAO通常不定义数据库事务,它们让服务执行此操作。

服务是执行某项任务的东西,例如,不同的用例通常不会沿着实体线干净地分解。此外,服务通常涉及实体试图避免的依赖关系(因为域模型是关于建模状态和对状态的更改,而依赖关系是关于基础结构)。服务可能具有为某些用户实现用例的方法,其中每个方法都是事务性的。

答案 2 :(得分:1)

概述可能过于高级,但以下是我以前接近分层的方式,它与您的传统N层架构非常相符。

Web - 用户浏览器与服务层之间的接口,将HTTP参数转换为服务层所需的数据。

---使用Business Objects在这些层之间进行通信---

服务 - Web层和DAO层之间的接口,这里没有特定于传输协议的内容,即没有HTTP请求/参数,在您的情况下是Business Objects。您的所有业务逻辑都存在于此处。例如,如果您的Web图层显示“向用户1234授予权限1”,则您的服务层会将权限1转换为READ,将用户1234转换为在DB中备份它的UserEntity。

---使用实体在这些层之间进行通信---

DAO - 你的服务层和实际的持久性机制之间的接口应该尽可能地愚蠢,这意味着如果“购买”对象预期有一个“用户”对象,那么DAO应该同时给它,它应该例如,不必处理查找用户的问题。

使用层之间的这种分离可以轻松地单独测试和维护每个层独立于其他层。要详细说明BO,如果从前端到服务层获取数据封装在单个对象中,那么最大的好处就是将实际的DB条目查找到服务层。希望它有所帮助。