在领域驱动的设计中,对持久性的调用在哪里?
本文关键字:持久性 调用 在哪里 | 更新日期: 2023-09-27 17:49:29
我知道网上和stackoverflow上有很多类似的信息,但我仍然不确定在哪里将持久性的逻辑放入我的项目中。我还没有使用任何ORM, IoC和UnitOfWork概念(对于ddd世界的初学者来说,太多新东西了)。
我看到Order模型有两个选项:
- 在Domain程序集中有一个
Order
类和一个IOrderRepository
接口。Order
类有一个私有的IOrderRepository
实例,它在构造函数中传递。Order类有一个公共Insert
方法,该方法调用IOrderRepository.Insert
方法。存储库的实际实现在基础设施层的OrderRepository
类中。服务层将包含一个OrderService
类,它用适当的存储库实例化我的模型,然后调用Order.Insert()
。缺点:我们必须向模型类注入存储库的接口(或多个实例),持久化逻辑在模型内部。好处:有时必须在插入方法调用之前或之后做一些事情,这可以很好地适合Order
类的Insert
方法,例如引发域事件或其他。 - 在
Model
程序集中只有Order
类。服务层创建新的Order
和新的OrderRepository
,并执行orderRepository.Insert(order)
。
你能不能用简单的话解释一下哪个概念更好(比如我是五岁)
您的域类应该只关注域的业务逻辑,并且应该忽略持久化(即持久化应该与业务逻辑分离)。添加与持久性相关的操作违反了单一职责原则。此外,对存储库的依赖使您的域类变得复杂,而不是简单的POCO实体。
让我们从编码的角度来考虑这个设计。您必须为每个Order
提供存储库实例,然后为该订单调用order.Insert()
,以将其自身传递给您注入到订单中的存储库。听起来很复杂。更简单的是使用repository.Save(order)
。有时在类上使用CRUD方法是可以的(参见活动记录模式)。但是当你没有复杂的领域模型时,这种方法是很好的。