【发布时间】:2009-02-27 19:35:34
【问题描述】:
我目前正在重构一个即将结束的项目的一些代码,我最终将大量业务逻辑放入服务类而不是域对象中。此时,大多数域对象只是数据容器。我决定在服务对象中编写大部分业务逻辑,然后将所有内容重构为更好、更可重用和更易读的形状。这样我就可以决定哪些代码应该放在域对象中,哪些代码应该分拆到它们自己的新对象中,以及哪些代码应该留在服务类中。所以我有一些代码:
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:我不认为批处理对象应该能够汇总任何应用程序列表,似乎它应该只能汇总该特定批次中的应用程序。否则,将函数留在服务类中对我来说更有意义。
【问题讨论】:
-
Pascal 大小写的局部变量。糟糕。
标签: c# design-patterns service domain-driven-design