DDD。我应该修改存储库中的实体吗?

时间:2016-01-22 07:50:17

标签: domain-driven-design repository-pattern ddd-repositories repository-design

我对实现DDD和存储库模式有疑问。 我应该修改存储库中的实体吗?

假设我有一个订单,并希望将该订单标记为已完成。 在我看来,我有两个选择。

    1。
    var order _orderRepository.GetById(1);
    order.Finish();
    _orderRepository.Update(order);
    

    ...在 Update 调用中将更改保留到数据库。

    2

    var order _orderRepository.GetById(1);
    var finishedOrder = _orderRepository.Finish(order);
    

    ...在完成调用中将更改保留到数据库。

    使用一种方法优于另一种方法是否有优势? DDD的做法是什么?

2 个答案:

答案 0 :(得分:5)

您不应在存储库中修改它。

原因是存储库负责抽象出持久性(即读/写数据存储)。

如果您还要对某些业务逻辑负责,那么您违反了单一责任原则。

如果您正在进行自动化测试,这也意味着您必须进行集成测试以确保数据库通信/映射正常工作,然后进行单元测试以验证您在其中引入的业务逻辑。

这看似微不足道。但是,当你第一次违反原则时,这只是微不足道的。但是,一次违规通常导致另一次违规,最后一次申请不易维护:)

类混合职责的应用程序也很难导航。每次要更新某个功能时,都必须通过所有层来查找实际逻辑的完成位置。

答案 1 :(得分:0)

使用应用程序层来协调一个或多个域对象的行为,域对象应该执行所有状态更改,最后,repo应该将这些更改持久保存到数据库或存储域状态的任何位置。