事实上,团队中的高级开发者并不建议这么做。一个基本原则:应尽量避免在聚合中使用资源库。那么,将businessPriorityTotals()方法声明为静态方法,然后将 Backlogitem集合作为参数传入,如何?
这样,几乎不用对该方法做多少修改,只需传入新参数:
那Product是创建该静态方法的最佳位置吗?
看来要将该方法放在合适的地方并非易事。由于该方法只使用了每个Backlogitem中的值对象,将该方法放在Backlogitem似乎更合适。但这里计算所得的业务价值却属于Product而非Backlogitem,进退维谷!
团队中的高级开发者发话了。他指出:这些问题用一个单一的建模工具即可解决,即领域服务(Domain Service)。
那领域服务是如何工作的?
======================================================================
听到“服务”,自然想到一个远程客户端与某复杂业务系统交互,该场景基本描述了SOA中的一个服务。有多种技术和方法可以实现SOA服务,最终这些服务强调的都是系统层面的
-
远程过程调用(RPC)或
-
消息中间件(MQ)
这些技术使得我们可通过服务与分布在不同地方的系统进行业务交互。
以上这些都不是领域服务。
不要将领域服务与应用服务混淆:
-
应用服务并不会处理业务逻辑
-
但领域服务恰恰是处理业务逻辑。应用服务是领域模型很自然的