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

Ton*_*imo 4 domain-driven-design ddd-repositories hexagonal-architecture clean-architecture

我\xe2\x80\x99m 设计一个运输应用程序并尝试使用清洁架构。我\xe2\x80\x99m 试图找出在哪里保存Shipment 对象的状态,以便每次用户单击UI 中的按钮时\xe2\x80\x99t 都必须重新实例化一个新对象。这是流程。

\n\n
    \n
  1. 用户在 UI 中输入送货号码
  2. \n
  3. UI 控制器处理 UI 事件并实例化用例交互器的实例\n a。存储库实例被传递到用例交互器的构造函数中
  4. \n
  5. 用例交互器通过调用工厂(例如CREATE_BY_DELIVERY)来实例化Shipment 的实例。工厂调用Repository从数据库收集数据。
  6. \n
  7. 交付数据填充在 UI 上
  8. \n
  9. 然后用户单击“报价”按钮
  10. \n
  11. UI 控制器处理按钮单击事件并调用用例交互器的 RATE_QUOTE 方法\na。用例交互器是否需要像步骤 #3 中那样再次调用 Shipment 工厂,或者用例交互器是否可以获得步骤 #3 中已创建的 Shipment 对象的实例?
  12. \n
  13. 费率显示在 UI 上
  14. \n
  15. 然后用户单击“处理发货”按钮
  16. \n
  17. UI 控制器处理按钮单击事件并调用用例交互器的 PROCESS_SHIPMENT 方法\na。用例交互器是否需要像步骤 #3 中那样再次调用 Shipment 工厂,或者用例交互器是否可以获得步骤 #3 中已创建的 Shipment 对象的实例?
  18. \n
\n\n

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

\n\n

先感谢您!

\n

Voi*_*son 7

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

是的,绝对如此——这是原始描述中的一部分要点

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

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

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

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

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

请记住,菲尔·卡尔顿多年前教过我们

计算机科学中只有两件难事:缓存失效和命名。