首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DDD存储库可以是有状态的吗?

DDD存储库可以是有状态的吗?
EN

Stack Overflow用户
提问于 2017-12-15 20:05:13
回答 2查看 1.4K关注 0票数 4

我正在设计一个运输应用程序,并试图使用清洁架构。我正在试图找出在哪里保存托运对象的状态,这样我就不必每次用户单击UI中的按钮时都重新实例化一个新对象。这是流动。

  1. 用户在UI中输入一个传递号。
  2. UI控制器处理UI事件,并实例化用例交互器a的一个实例。
  3. 用例交互器通过调用工厂(例如CREATE_BY_DELIVERY)来实例化装运实例。工厂调用存储库从数据库中收集数据。
  4. 在UI上填充交付数据。
  5. 然后,用户单击费率引用按钮。
  6. UI控制器处理按钮单击事件并调用用例交互器a的RATE_QUOTE方法。用例交互器是否需要像步骤3那样再次调用发货工厂,还是用例交互器可以获得已在步骤3中创建的托运对象的实例?
  7. 费率显示在用户界面上。
  8. 用户然后单击“进程托运”按钮。
  9. UI控制器处理按钮单击事件并调用用例交互器a的PROCESS_SHIPMENT方法。用例交互器是否需要像步骤3那样再次调用发货工厂,还是用例交互器可以获得已在步骤3中创建的托运对象的实例?

托运对象的状态应该是UI控制器、用例交互器或存储库上的实例变量吗?理想情况下,我希望将其保存在某个地方,这样每当用户单击UI上的按钮时,我都不需要继续创建一个新对象。

提前谢谢你!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-15 20:59:27

DDD存储库可以是有状态的吗?

是的,当然--这是原始描述的一部分。

存储库将特定类型的所有对象表示为概念集(通常是模拟的)。它的作用就像一个集合,除了更精细的查询能力.对于需要全局访问的每种类型的对象,创建一个可以提供该类型所有对象在内存中集合的错觉的对象。

换句话说,重点是将应用程序组件与集合的实现细节分开。就应用程序而言,存储库可以实现为有状态的、内存中的键/值存储。

理想情况下,我希望将其保存在某个地方,这样每当用户单击UI上的按钮时,我都不需要继续创建一个新对象。

为了使您的代码易于理解,您可能应该每次创建一个新对象,并且只有在您有明确的业务案例时,才能处理缓存的复杂问题。

也就是说,存储库的实现完全没有理由不能包含最近使用的对象的缓存。您只需愿意投资于缓存失效策略。

记住,菲尔·卡尔顿几年前就教过我们

计算机科学中只有两大难题:缓存失效和命名问题。

票数 7
EN

Stack Overflow用户

发布于 2017-12-16 00:13:57

从理论上讲,从定义上来说,它总是有状态的。您是在询问存储库在加载/存储集合时是否可以使用缓存。所以又是这样,但是。缓存是一件复杂的事情,除非是必要的,否则应该避免。

在这种情况下,使用缓存会损害应用程序的水平可伸缩性。它很难有多个实例。很难在数据库/持久性级别使用乐观锁定,在加载聚合时需要正确设置聚合版本(必须是最大的),否则预期版本(加载的版本+ 1)不匹配。换句话说,正如@VoiceOfUn故所言,很难以一种有效的方式使缓存失效。

因此,如果您愿意松散水平可伸缩性,那么可以缓存Aggregates。

P.S.这不适用于事件源聚合存储库。在这种情况下,您可以将快照保存在内存中,但仍然可以触摸/查询事件存储区中的新事件。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47839180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档