domain-driven-design - DDD 存储库可以是有状态的吗?

标签 domain-driven-design ddd-repositories clean-architecture hexagonal-architecture

我正在设计一个运输应用程序并尝试使用 Clean Architecture。我试图找出在何处保存 Shipment 对象的状态,以便每次用户单击 UI 中的按钮时都不必重新实例化新对象。这是流程。

  • 用户在 UI 中输入送货编号
  • UI Controller 处理 UI 事件并实例化用例交互器的实例
    一种。传递给用例交互器的构造函数的存储库实例
  • 用例交互器通过调用工厂(例如 CREATE_BY_DELIVERY)来实例化 Shipment 的实例。工厂调用 Repository 从数据库中收集数据。
  • 交付数据填充在 UI 上
  • 然后用户单击“报价报价”按钮
  • UI Controller 处理按钮点击事件并调用 Use Case Interactor 的 RATE_QUOTE 方法
    一种。用例交互器是否需要像步骤#3 中那样再次调用 Shipment 工厂,或者用例交互器是否可以获得在步骤 #3 中已经创建的 Shipment 对象的实例?
  • 费率显示在 UI
  • 然后用户单击“处理发货”按钮
  • UI Controller 处理按钮点击事件并调用 Use Case Interactor 的 PROCESS_SHIPMENT 方法
    一种。用例交互器是否需要像步骤#3 中那样再次调用 Shipment 工厂,或者用例交互器是否可以获得在步骤 #3 中已经创建的 Shipment 对象的实例?

  • 运输对象的状态应该是 UI Controller 、用例交互器还是存储库上的实例变量?理想情况下,我想将它保存在某个地方,这样每次用户单击 UI 上的按钮时我都不需要继续创建新对象。

    先感谢您!

    最佳答案

    Can a DDD repository be stateful?



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

    A REPOSITORY represents all objects of a certain type as a conceptual set (usually emulated). It acts like a collection, except with more elaborate querying capability.... For each type of object that needs global access, create an object that can provide the illusion of an in memory collection of all objects of that type.



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

    Ideally, I'd like to save it somewhere so I don't need to keep creating a new object every time a user clicks a button on the UI.



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

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

    记住,Phil Karlton 多年前教过我们

    There are only two hard things in Computer Science: cache invalidation and naming things.

    关于domain-driven-design - DDD 存储库可以是有状态的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47839180/

    相关文章:

    c# - DDD : entities mapped to tables with lots of databse columns

    model-view-controller - DDD/MVC : how to avoid hitting the Repository from the View?

    TDD 演示/指南/视频,包括假存储库或域模型

    swift - 在 Xcode 中使用整洁的 swift 架构的注册页面出现问题

    architecture - 关联有界上下文的数据

    architecture - CQRS:查询和业务规则

    asp.net-mvc - 防止 MVC EF 应用程序中事件重叠的最佳方法是什么?

    c# - 工作单元模式中的 EF Core 封装

    design-patterns - 需要帮助建模图像和一些使用它们的类之间的关系

    android - 在使用 RxJava2 和 Retrofit2 时如何访问响应 header ?