在领域驱动的设计中,对持久性的调用在哪里?

本文关键字:持久性 调用 在哪里 | 更新日期: 2023-09-27 17:49:29

我知道网上和stackoverflow上有很多类似的信息,但我仍然不确定在哪里将持久性的逻辑放入我的项目中。我还没有使用任何ORM, IoC和UnitOfWork概念(对于ddd世界的初学者来说,太多新东西了)。

我看到Order模型有两个选项:

  1. 在Domain程序集中有一个Order类和一个IOrderRepository接口。Order类有一个私有的IOrderRepository实例,它在构造函数中传递。Order类有一个公共Insert方法,该方法调用IOrderRepository.Insert方法。存储库的实际实现在基础设施层的OrderRepository类中。服务层将包含一个OrderService类,它用适当的存储库实例化我的模型,然后调用Order.Insert()。缺点:我们必须向模型类注入存储库的接口(或多个实例),持久化逻辑在模型内部。好处:有时必须在插入方法调用之前或之后做一些事情,这可以很好地适合Order类的Insert方法,例如引发域事件或其他。
  2. Model程序集中只有Order类。服务层创建新的Order和新的OrderRepository,并执行orderRepository.Insert(order)

你能不能用简单的话解释一下哪个概念更好(比如我是五岁)

在领域驱动的设计中,对持久性的调用在哪里?

您的域类应该只关注域的业务逻辑,并且应该忽略持久化(即持久化应该与业务逻辑分离)。添加与持久性相关的操作违反了单一职责原则。此外,对存储库的依赖使您的域类变得复杂,而不是简单的POCO实体。

让我们从编码的角度来考虑这个设计。您必须为每个Order提供存储库实例,然后为该订单调用order.Insert(),以将其自身传递给您注入到订单中的存储库。听起来很复杂。更简单的是使用repository.Save(order)。有时在类上使用CRUD方法是可以的(参见活动记录模式)。但是当你没有复杂的领域模型时,这种方法是很好的。

我认为你的领域持久化最好的地方是应用服务(也许你把这个层称为Service层)。它们从存储库加载实体,执行操作(可以是对实体的简单操作,或者对域服务的调用),然后保存域的状态。