Я прийшов із світу сценаріїв транзакцій, і я тільки починаю дивитися на DDD. Я не впевнений у правильному способі інтеграції дизайну DDD із збереженням бази даних. Ось що я маю:
Клас обслуговування під назвою OrganisationService, інтерфейс якого містить методи для отримання та збереження примірників об’єктів домену організації. Організація є сукупним коренем і має інші пов'язані з нею дані: Члени та Ліцензії. Перша база даних DBContext бази даних EF6 використовується в OrganisationService для отримання об'єктів DBB Організації та пов'язаних з ними організацій MemberDB та LicenseDB. Усі вони перетворюються в еквіваленти класу об'єктного домену, коли їх отримує OrganisationService та завантажується в об'єкт домену Організація. Цей об’єкт виглядає так:
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
}
Я не використовую шаблон репозиторію в OrganisationService ... Я використовую сам EF як сховище, оскільки, здається, EF6 значною мірою зробив репозиторій зайвим.
На даний момент в дизайні об’єкт домену Організація є анемічним: він схожий на клас організації P POCO. Клас OrganisationService дуже схожий на сховище!
Тепер мені потрібно почати додавати логіку. Ця логіка включає управління ліцензіями та членами організацій. Тепер у дні сценарію транзакцій я б додав методи в OrganisationService для обробки цих операцій і закликав у сховище взаємодіяти з БД, але з DDD я вважаю, що ця логіка повинна бути інкапсульована в самому об'єкті домену Організації ...
Тут я не впевнений, що мені робити: мені потрібно буде зберігати ці дані назад до бази даних як частина логіки. Чи означає це, що я повинен використовувати DbContext в об'єкті домену Організація для цього? Чи погана практика використання сховища / EF у об’єкті домену? Якщо так, то де ця наполегливість належить?
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
public void AddLicensesToOrganisation(IList<License> licensesToAdd)
{
// Do validation/other stuff/
// And now Save to the DB???
using(var context = new EFContext())
{
context.Licenses.Add(...
}
// Add to the Licenses collection in Memory
Licenses.AddRange(licensesToAdd);
}
}
Чи повинен я замість цього просто мутувати об'єкт домену Організації в пам'яті, а потім відштовхувати його назад до OrganisationService? Тоді я повинен відстежувати, що насправді змінилося на об’єкті (а це те, що EF робить для власних POCO! Я начебто відчуваю, що EF - це не просто заміна сховища, але також може бути доменним шаром!)
Будь-які вказівки тут високо оцінені.