Domain driven design 我们是否应该将呼叫和协调工作分配给域服务?

Domain driven design 我们是否应该将呼叫和协调工作分配给域服务?,domain-driven-design,n-tier-architecture,Domain Driven Design,N Tier Architecture,应用程序服务通过调用和协调对工作流、基础设施服务、域服务和域实体的调用来实现客户端(即表示层)发出的命令 很少有域服务执行与应用程序服务类似的工作,这是否是一种常见做法,这意味着它们也进行和协调调用,唯一的区别是它们在更细粒度的级别上进行调用(即它们只进行和协调对其他域服务和域对象的调用) 如果是的话,有什么想法这些域服务应该是多细粒度的吗 谢谢域服务包含的域逻辑不适合任何实体,或者跨多个实体 一个经常被引用的例子是FundsTransferService。转移资金似乎不是BankAccount

应用程序服务通过调用和协调对工作流、基础设施服务、域服务和域实体的调用来实现客户端(即表示层)发出的命令

很少有域服务执行与应用程序服务类似的工作,这是否是一种常见做法,这意味着它们也进行和协调调用,唯一的区别是它们在更细粒度的级别上进行调用(即它们只进行和协调对其他域服务和域对象的调用)

如果是的话,有什么想法这些域服务应该是多细粒度的吗


谢谢

域服务包含的域逻辑不适合任何实体,或者跨多个实体

一个经常被引用的例子是FundsTransferService。转移资金似乎不是BankAccount实体的责任,因为这意味着源帐户可以修改目标帐户的余额(或者反过来),这看起来很尴尬,可能很危险。FundsTransferService中的专用TransferFunds()方法可以更好地分离关注点,并在一个地方引导所有资金流动

在这方面,您可以说域服务协调对实体和其他服务的调用,但与应用层服务的协调意义不同。通常,应用层服务只是样板程序代码,而域服务包含真正的业务规则

唯一的区别在于它们是在更细粒度的级别上进行的


我不会说域服务比应用程序服务更细粒度。它们本质上只是在不同的层中。这就像说存储库比控制器粒度更细。。。通常,粒度是衡量一个内聚操作在多大程度上被分解为更小的部分而不是一个大的过程。

域服务包含的域逻辑并不特别适合任何实体,或者跨多个实体

一个经常被引用的例子是FundsTransferService。转移资金似乎不是BankAccount实体的责任,因为这意味着源帐户可以修改目标帐户的余额(或者反过来),这看起来很尴尬,可能很危险。FundsTransferService中的专用TransferFunds()方法可以更好地分离关注点,并在一个地方引导所有资金流动

在这方面,您可以说域服务协调对实体和其他服务的调用,但与应用层服务的协调意义不同。通常,应用层服务只是样板程序代码,而域服务包含真正的业务规则

唯一的区别在于它们是在更细粒度的级别上进行的


我不会说域服务比应用程序服务更细粒度。它们本质上只是在不同的层中。这就像说存储库比控制器粒度更细。。。通常,粒度是衡量一个内聚操作在多大程度上被分解为更小的部分,而不仅仅是一个大的过程。

我想我在区分业务规则和用例方面仍然有很大的困难。例如,订购项目通常被视为一个用例,但我个人也可以将订购项目解释为一个业务规则,并将其实现为一个域服务(它将在域服务和域实体之间进行并协调调用,以检查信用、创建发货交易、管理库存等)?! Uh:(特定于应用程序的业务规则(用例)和不可知于应用程序的业务规则(域)之间有一条细微的界限)。限制由您自己来确定-但是,您在域实体中放置的业务逻辑越多,它的可重用性就越强,您的应用程序服务也就越精简。在您的示例中,如果不是所有订单都会导致发货交易(例如,可下载的数字商品,请不要),更好的解决方案是在具有多态性的域中处理该问题,并使应用程序服务不知道该细节,而不是添加“if”在用例中。我想我在区分业务规则和用例方面仍然有很大的困难。例如,订购一个项目通常被认为是一个用例,但我个人也可以将订购一个项目解释为一个业务规则,从而将其实现为一个域服务(这将在域服务和域实体之间进行并协调呼叫,以检查信用、创建配送交易、管理库存等)?!呃:(在特定于应用程序的业务规则(用例)和不可知于应用程序的业务规则(域)之间有一条细微的界限)。限制由您自己来确定-但是,您在域实体中放置的业务逻辑越多,它的可重用性就越强,您的应用程序服务也就越精简。在您的示例中,如果不是所有订单都会导致发货交易(例如,可下载的数字商品,请不要),更好的解决方案是在具有多态性的域中处理该问题,并让应用程序服务不知道该细节,而不是在用例中添加“if”。