什么时候以及为什么应该使用域服务?

我有一个Rental实体,它是一个聚合根。除其他事项外,它维护分配列表(保留的时间块)。

如何添加新分配?由于“租用”是聚合根,因此任何新分配都应经过“租用”,但是在尝试将分配保存到数据库之前,无法说出是否可以分配租用。同时,另一个用户可能已经保留了它。我猜,我应该为此使用域服务吗?

我讨厌每次需要新的Rental时都必须注入任何东西,但是除了术语有所不同之外,注入域服务而不是存储库有什么区别?

非理性之声

什么时候以及为什么应该使用域服务?

您使用域服务来允许聚合运行查询。税收计算是显示表格不时出现的示例。聚合将某种状态传递给计算器,计算器报告税金,聚合决定如何处理该信息(忽略该信息,拒绝需要该信息的更新,等等)。

运行查询不会以任何方式修改域服务实例,因此您可以根据需要多次重复查询,而不必担心计算会相互污染。

认为只读服务提供商。

由于“租用”是聚合根,因此任何新分配都应经过“租用”,但是在尝试将分配保存到数据库之前,无法说出是否可以分配租用。同时,另一个用户可能已经保留了它。我猜,我应该为此使用域服务吗?

否-完全错误的用例。

如果分配是Rental集合的一部分,那么最好让Rental集合自己创建分配。您不需要为此提供服务(如果您希望将关注点分离,则可以将工作委托给工厂)。

如果“其他用户同时可以保留该分配”,则您有争执-两个用户试图同时更改同一聚合。通常,可以通过以下两种方式之一进行管理。

锁定:您一次只允许一个用户修改租赁汇总。因此,在数据竞赛中,失败者必须等待获胜者完成,然后聚合才能拒绝失败者的命令,因为已经进行了特定分配。

乐观并发:您允许两个用户同时修改聚合的不同副本,但是仅当原始状态不变时才允许保存。认为“比较并交换”;在这两个指令之间,比赛处于保存状态

state.compareAndSwap(originalState, loserState)
state.compareAndSwap(originalState, winnerState)

优胜者的比较和交换成功,但失败者的失败(因为originalState!= WinnerState),因此失败者的修改被拒绝。

无论哪种方式,都只允许对数据库进行一次写操作以保留该分配。

如果我正确理解您的意思,那是在这种情况下,可以从Rental域实体内部使用存储库吗?

不,您不需要-分配是“租用”聚合的一部分,由该聚合在内存中创建,并在保存该聚合时首先出现在您的数据存储区中。

如果必须将所有重要的结果都提取到周围的代码或工厂中,为什么还要使用聚合呢?

这里的一些答案是关注点分离-聚合的主要关注点是强制执行业务不变性:确保创建具有某些特定状态的分配与其他所有操作保持一致。工厂负责确保正确连接创建的对象。

以您的示例为例:工厂将负责在内存中创建分配,但无需了解有关确保分配唯一的信息。汇总描述并强制执行确保分配唯一的规则。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

什么时候,在哪里以及为什么我应该对控制结构使用“替代语法”?

什么时候以及为什么我应该使用namedtuple而不是字典?

什么时候以及为什么我应该使用session_regenerate_id()?

什么时候以及为什么应该使用NSUserDefaults的syncnize()方法?

什么时候以及为什么应该使用apt-get update?

什么时候以及为什么我们应该在角度使用View Encapsulation

什么时候以及为什么在constexpr中使用static?

什么时候以及为什么使用next_by_code()?

什么时候应该使用unbindService(),以及如何正确使用它与使用AIDL接口的远程服务解除绑定?

什么时候以及为什么我应该触发pg_stat_reset()?

什么时候应该使用静态方法?

我什么时候应该使用GROUP BY?

什么时候应该使用呢?

什么时候应该使用RequireJS?

我什么时候应该使用blockingGet?

我什么时候应该使用SynchronousQueue

什么时候应该使用弱引用?

什么时候应该使用iter函数?

什么时候应该使用流?

什么时候应该使用LinearSVC或SVC?

什么时候应该使用instanceof?

我什么时候应该使用`sparse`?

什么时候应该使用TaskCompletionSource <T>?

什么时候应该使用Hashtable与HashMap

什么时候应该使用ConcurrentSkipListMap?

什么时候应该使用列表与LinkedList

什么时候应该使用“ ngProjectAs”属性?

什么时候应该使用并行编程?

什么时候应该使用Struct与OpenStruct?

TOP 榜单

热门标签

归档