我目前正在重构一个即将结束的项目的一些代码,我最终将大量业务逻辑放入服务类而不是域对象中。此时,大多数域对象只是数据容器。我决定在服务对象中编写大部分业务逻辑,然后将所有内容重构为更好、更可重用和更易读的形状。这样我就可以决定哪些代码应该放在域对象中,哪些代码应该分拆到它们自己的新对象中,以及哪些代码应该留在服务类中。所以我有一些代码:
public decimal CaculateBatchTotal(VendorApplicationBatch batch)
{
IList<VendorApplication> applications = AppRepo.GetByBatchId(batch.Id);
if (applications == null || applications.Count == 0)
throw new ArgumentException("There were no applications for this batch, that shouldn't be possible");
decimal total = 0m;
foreach (VendorApplication app in applications)
total += app.Amount;
return total;
}
这段代码似乎可以很好地添加到域对象中,因为它的唯一输入参数是域对象本身。似乎是一些重构的完美候选者。但唯一的问题是这个对象调用了另一个对象的存储库。这让我想把它留在服务课上。
我的问题是:
- 你会把这段代码放在哪里?
- 你会打破这个功能吗?
- 遵循严格的领域驱动设计的人会把它放在哪里?
- 为什么?
谢谢你的时间。
编辑注意:不能在这个上使用 ORM,所以我不能使用延迟加载解决方案。
编辑注2:我不能改变构造函数来接受参数,因为可能的数据层如何使用反射来实例化域对象(不是我的想法)。
编辑注3:我不认为批处理对象应该能够汇总任何应用程序列表,似乎它应该只能汇总该特定批次中的应用程序。否则,将函数留在服务类中对我来说更有意义。