我正在开发一个应用程序,该应用程序具有在域模型上运行的服务层。在当前的设计中,我通过服务层向上传递域对象(例如,在调用 EmploymentService.getEmployee()
时返回一个 Employee
域对象,但要求在对象通过服务(例如 EmploymentService.transferEmployee(int employeeId, int newLocationId)
。(顺便说一句,示例是人为设计的)。
我觉得这有点不对劲。第一,它看起来像过程编程。第二,域对象有像 Employee.setLocationId
这样的 setter,客户端可以调用它,当然不会将员工转移到新位置,因为假设需要协调不同系统的所有复杂操作转移员工在服务层。
如果我可以对客户端隐藏 setter,我会感觉更好,但是不同包中的 ServiceLayer 和 DAO 都需要能够访问域对象的 setter。
这种事情可以吗,或者有更好的方法吗? (此外,欢迎任何具有底层领域模型的服务层的真实示例!)
此外,我已经阅读了贫血领域模型反模式,我认为我没有落入那个陷阱,但我不完全确定!
最佳答案
首先,客户端调用 Employee.Transfer() 的问题实际上并不需要: 我喜欢只从我的服务层返回 DTO。这些 DTO 包含数据但不包含方法。这解决了客户端调用 Employee.Transfer() 的问题。
接下来,将所有代码都放在 EmploymentService.transferEmployee() 中的问题。你说感觉不对,因为它看起来像过程式编程。解决方案是在您放入服务的逻辑和放入域对象的逻辑之间找到一个很好的组合。例如:
领域对象做:
- 检查是否没有被删除
- 检查它是否已经在该位置
- 等等
服务层:
- 加载员工
- 调用 Employee.Transfer
- 向员工发送电子邮件
- 向位置管理员发送电子邮件
- 等等
我可能会在此代码中使用 Location Domain 对象:
public class Location
{
public void AddEmployee(Employee emp)
{
if(!IsFull)
Employees.Add(emp);
}
public void RemoveEmployee(Employee emp)
{
Employees.Remove(emp);
If(Employees.Count < 100)
IsFull = false;
}
}
关于java - 服务层和领域模型的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10049355/