DDD。我应该修改存储库中的实体吗?
DDD. Should I modify a entity inside a repository?
我对实施 DDD 和存储库模式有疑问。
我应该修改存储库中的实体吗?
假设我有一个订单并想将该订单标记为已完成。
如我所见,我有两个选择。
1.
var order _orderRepository.GetById(1);
order.Finish();
_orderRepository.Update(order);
...在 Update 调用中将更改持久保存到数据库。
2.
var order _orderRepository.GetById(1);
var finishedOrder = _orderRepository.Finish(order);
...在 Finish 调用中将更改持久保存到数据库。
使用一种方法比使用另一种方法有优势吗?这样做的 DDD 方式是什么?
您不应在存储库中修改它。
原因是存储库负责抽象持久性(即 reading/writing 到数据存储)。
如果您还让它负责某些业务逻辑,那么您就违反了单一职责原则。
如果您正在进行自动化测试,这也意味着您必须进行集成测试以确保数据库 communication/mapping 正常工作,然后进行单元测试以验证您在其中引入的业务逻辑。
这看起来微不足道。但这只是第一次违反原则时的小事。但是一个违规行为通常会导致另一个违规行为,最后导致一个不容易维护的应用程序:)
类 具有混合职责的应用程序也更难导航。每次要更新功能时,您都必须遍历所有层以找到实际逻辑完成的位置。
使用应用层协调一个或多个域对象的行为,域对象应执行所有状态更改,最后,存储库应将这些更改保存到数据库或存储域状态的任何位置。
我对实施 DDD 和存储库模式有疑问。 我应该修改存储库中的实体吗?
假设我有一个订单并想将该订单标记为已完成。 如我所见,我有两个选择。
-
1.
var order _orderRepository.GetById(1);
order.Finish();
_orderRepository.Update(order);
...在 Update 调用中将更改持久保存到数据库。
2.
var order _orderRepository.GetById(1);
var finishedOrder = _orderRepository.Finish(order);
...在 Finish 调用中将更改持久保存到数据库。
使用一种方法比使用另一种方法有优势吗?这样做的 DDD 方式是什么?
您不应在存储库中修改它。
原因是存储库负责抽象持久性(即 reading/writing 到数据存储)。
如果您还让它负责某些业务逻辑,那么您就违反了单一职责原则。
如果您正在进行自动化测试,这也意味着您必须进行集成测试以确保数据库 communication/mapping 正常工作,然后进行单元测试以验证您在其中引入的业务逻辑。
这看起来微不足道。但这只是第一次违反原则时的小事。但是一个违规行为通常会导致另一个违规行为,最后导致一个不容易维护的应用程序:)
类 具有混合职责的应用程序也更难导航。每次要更新功能时,您都必须遍历所有层以找到实际逻辑完成的位置。
使用应用层协调一个或多个域对象的行为,域对象应执行所有状态更改,最后,存储库应将这些更改保存到数据库或存储域状态的任何位置。