DDD - 业务决策基于数据库逻辑

时间:2017-02-15 11:17:13

标签: domain-driven-design ddd-repositories

我试图按照以下模式跟踪DDD。

devDependencies

正如您在上图中看到的那样,域层是独立的,可以做出业务决策,但就我而言,大多数业务决策都是即时采取的。例如,

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

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

正如您在上面看到的示例所示,应用程序通过进行数据库调用即时做出了很多业务决策。由于域层不应该依赖于存储库层,我不知道如何继续。

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

请帮助我。

-Pandian

2 个答案:

答案 0 :(得分:4)

至少有三种可能的出路

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

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

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

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

答案 1 :(得分:1)

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

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

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