Я пришел из мира сценариев транзакций, и я только начинаю смотреть на DDD. Я не уверен в правильном способе интеграции дизайна DDD с сохранением базы данных. Вот что у меня есть:
Класс обслуживания с именем OrganisationService, интерфейс которого содержит методы для извлечения и сохранения экземпляров объектов домена организации. Организация является совокупным корнем и имеет другие связанные с ней данные: участники и лицензии. Сначала DBContext базы данных EF6 используется в OrganisationService для извлечения сущностей OrganisationDB и связанных сущностей MemberDB и LicenseDB. Все они преобразуются в свои эквиваленты класса объекта домена, когда извлекаются OrganisationService и загружаются в объект домена организации. Этот объект выглядит так:
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
}
Я не использую шаблон репозитория в OrganisationService ... Я использую сам EF в качестве репозитория, так как кажется, что EF6 в значительной степени сделал репозиторий избыточным.
На данный момент в проекте объект домена Organization является анемичным: он выглядит как класс организации EF 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 - это не просто замена репозитория, но и уровень домена!)
Любое руководство здесь приветствуется.
источник
я не знаю EF6, но другие ORM обрабатывают это прозрачно, поэтому вам не нужно явно добавлять лицензии в контекст, он обнаружит их при сохранении изменений. Таким образом, метод будет до
и код вокруг него
источник