В настоящее время я выполняю рефакторинг некоторого кода в завершающем проекте, и в итоге я вложил много бизнес-логики в классы обслуживания, а не в объекты домена. На данный момент большинство объектов домена являются только контейнерами данных. Я решил написать большую часть бизнес-логики в сервисных объектах и впоследствии преобразовать все в лучшие, более многократно используемые и более читаемые формы. Таким образом, я мог решить, какой код должен быть помещен в объекты домена, а какой код должен быть выделен в новые собственные объекты, а какой код должен быть оставлен в классе обслуживания. Итак, у меня есть код:
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: Я не верю, что пакетный объект должен иметь возможность составлять только любой список приложений, похоже, он должен иметь возможность только суммировать приложения, которые находятся в этом конкретном пакете. В противном случае для меня более разумно оставить функцию в классе обслуживания.