Раньше я имел дело с простыми приложениями, в которых есть Service Layer, содержащий всю бизнес-логику. В Domain Driven Design принято хранить бизнес-логику в богатой модели.
Просмотрел руководство Pluralsight, в котором они упоминают Репозитории, и заметил, что репозиторий обычно содержит основные операции CRUD (создание, обновление, выборка и удаление объектов). Ничего особенного в отношении Entity Framework не объяснялось.
Entity Framework 6 и Entity Framework Core уже предоставляют Repository/UoW из коробки. Мне интересно, можно ли в этом случае не создавать уровень репозитория?
Итак, как я себе представляю приложение без отдельного слоя репозитория...
Мое понимание:
Например, у нас есть модель Customer
в качестве сводного корня (богатая модель предметной области). И эта модель имеет отношение «один ко многим» ICollection<Payment> Payments
. Плюс, согласно DDD — мы храним нашу логику внутри модели — так что у нас есть метод MakePayment
.
Код будет следующим:
public class Customer
{
public virtual ICollection<Payment> Payments { get; set; }
// ... other properties/collections
public void MakePayment(decimal amount)
{
this.Payments.Add(new Payment() { Amount = amount });
}
}
С помощью Entity Framework мы можем нетерпеливо загрузить все дерево с результатом Customer
, в котором уже сопоставлены все их Payments
.
(скажем, мы имеем дело с приложением ASP.NET WebAPI)
Итак, чтобы произвести оплату, я думаю, мы делаем следующее:
в нашем контроллере/сервисе получаем клиента (например по
id
)затем следует код
customer.MakePayment(10);
после этого мы вызываем метод
dbContext.SaveChanges()
DbContext
отслеживает изменения и сохраняет платеж — Бинго!
Правильно ли я понимаю?
Что касается сервисного уровня:
Можно ли использовать сервисный уровень с DDD в таком веб-приложении?
Я по-прежнему считаю, что хранить код в контроллере не обязательно правильно (даже с DDD), если, например, часть функций МОЖЕТ БЫТЬ востребована в приложении WPF, поэтому мы можем использовать с ней сервисный уровень.
Кажется, это самый оптимальный подход, не так ли?