【问题标题】:DDD - Business decisions are based on database logicDDD - 业务决策基于数据库逻辑
【发布时间】:2017-07-04 00:32:00
【问题描述】:

我正在尝试按照以下模式遵循 DDD。

Controller-----DataContract----> Domain Layer (DDD)

Controller-----Domain Object---> Repository---Entity--->EntityFramework

正如您在上图中看到的,域层 是独立做出业务决策的,但在我的例子中,大多数业务决策都是即时做出的。例如,

if(Account Number Associated?)
     Load CustomerDetails //A database call is needed
     ....
     .....
     if(Has customer another loan)
           .....
           .....
           Load other loan details //A database call is needed
           .....
           .....
           if(Was that repaid?)
               ....
               ....
               Load collateral details //A database call is needed
               .....
               .....
               Calculate collateral details and return.
           else
               Load other data //A database call is needed
      else
           Load other data //A database call is needed

else
     Load other data //A database call is needed

正如您在上面的示例中看到的那样,应用程序通过调用数据库来动态做出许多业务决策。由于 Domain Layer 不应该依赖于 Repository Layer,我不知道如何进行。

我可能会使用应用程序服务进行数据库调用,但是域层不会有任何逻辑。所有逻辑都将进入应用程序服务

请帮帮我。

-盘点

【问题讨论】:

    标签: domain-driven-design ddd-repositories


    【解决方案1】:

    至少有三种可能的出路

    1) 设计您的存储库以一次加载整个聚合。这种方法可以立即为域模型提供它可能需要的所有状态,而不是尝试按需加载状态。

    2) 在应用服务中运行查询,并将数据传递给领域模型。理想情况下,您提前执行此操作(以便您对域模型进行一次调用),但是当这没有意义时,您让域模型告诉应用服务需要哪些数据,应用服务会发现数据并返回。

    3) 将存储库传递到允许它读取所需数据的域模型中。这本质上是“域服务”模式,但用于访问数据存储。

    在此设计中,域模型定义存储库接口,应用程序提供实现。换句话说,我们使用服务提供者模式来保持依赖箭头指向正确的方向。

    【讨论】:

    • 嗨@VoiceOfUnreason,感谢您的帮助。在我的情况下,前两种方法是不可能的。您能否为这种“域服务”指出一些 github/代码示例?另外,当您说“应用程序提供实现”时,意味着“应用程序服务提供实现”对吗?
    • @VoiceOfUnreason 在第三种解决方案中,依赖点从领域模型指向存储库层!那怎么样。
    【解决方案2】:

    @Pandiarajan 领域层可以包含领域模型(实体、值对象)、领域服务和领域事件。

    通过上面的代码,您可以创建一个域服务来封装所有这些域逻辑和概念,这些逻辑和概念并非自然建模为值对象或实体。这些域服务可以采用处理所有数据库调用的存储库。

    另请注意,如果您需要返回的数据用于只读或报告目的,您可能需要寻找 CQRS 作为替代。在 CQRS 中,所有这些读取查询都可以绕过您的领域层来呈现数据。 CQRS 将消除将数据转换为域模型的需要。

    【讨论】:

    • 您能帮我指出一些 github 或其他地方的示例项目吗?
    猜你喜欢
    • 2013-01-30
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 2016-12-06
    • 2011-05-02
    • 2011-09-14
    • 2016-10-02
    相关资源
    最近更新 更多