Наш текущий инструмент O/RM на самом деле не позволяет использовать модели с богатым доменом, поэтому мы вынуждены везде использовать анемичные (DTO) объекты. Это отлично работает, но я продолжаю бороться с тем, где поставить базовую объектную бизнес-логику и рассчитанные поля.
Текущие слои:
- Презентация
- Сервис
- Repository
- Data/Entity
Наш уровень репозитория имеет большую часть базовой логики fetch/validate/save, хотя уровень сервиса выполняет большую сложную проверку и сохранение (поскольку операции сохранения также выполняют ведение журнала, проверку разрешений и т.д.). Проблема заключается в том, где поставить такой код:
Decimal CalculateTotal(LineItemEntity li)
{
return li.Quantity * li.Price;
}
или
Decimal CalculateOrderTotal(OrderEntity order)
{
Decimal orderTotal = 0;
foreach (LineItemEntity li in order.LineItems)
{
orderTotal += CalculateTotal(li);
}
return orderTotal;
}
Любые мысли?