标签:java design-patterns domain-driven-design
我正在开发一个具有在域模型上运行的服务层的应用程序.在当前设计中,我将域对象传递到服务层(例如,在调用EmploymentService.getEmployee()时返回Employee域对象,但要求对对象执行的操作通过服务进行(例如EmploymentService.transferEmployee(int employeeId) ,int newLocationId).(顺便说一下,例子是人为的).
这对我来说有点不对劲.一,它似乎是程序式编程.二,域对象有像Employee.setLocationId这样的设置器,客户端可以调用它当然不会将员工转移到新的位置,因为协调不同系统所需的所有复杂操作都是假设转移员工所在的服务都在服务中层.
如果我可以从客户端隐藏setter,我会感觉更好,但不同包中的ServiceLayer和DAO都需要能够访问域对象的setter.
这种事情好吗,还是有更好的方法? (此外,欢迎使用基础域模型的任何实际服务层示例!)
此外,我已经阅读了贫血领域模型反模式,我不认为我陷入了这个陷阱,但我不完全确定!
解决方法:
首先,客户端调用您实际上并不想要的Employee.Transfer()的问题:
我喜欢只从我的服务层返回DTO.这些DTO包含数据而没有方法.这解决了客户端调用Employee.Transfer()的问题.
接下来,在EmploymentService.transferEmployee()中包含所有代码的问题.你说它感觉不对,因为它看起来像程序编程.解决方案是在您放入服务的逻辑和放入Domain对象的逻辑之间找到一个很好的组合.例如:
域对象:
>检查是否未删除
>检查它是否已经在该位置
>等等
服务层确实:
>加载员工
>致电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,design-patterns,domain-driven-design 来源: https://codeday.me/bug/20190530/1183789.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。