Сохранение модели предметной области
-
22-08-2019 - |
Вопрос
Недавно закончил читать Eric Evans Domain Driven Design (очень информативный, очень приятный), однако перешел к первому крупному проекту с момента завершения книги и столкнулся с вопросом, как справиться с сохранением модели домена?
Я ценю использование сервисов / репозиториев и то, как они могут помочь модели, но как они будут обрабатывать сохранение модели?
Мои предыдущие сохранения модели домена будут следовать следующей структуре вызова метода;
Родительский класс.Сохранить {
База данных родительского класса.Сохранить
Дочерний объект1.Сохранить
ChildObject1DB.Save
Дочерний объект2.Сохранить
ChildObject2DB.Save
etc etc
}
Получает ли служба контроль над вызовом соответствующих процедур сохранения для дочерних объектов?
Решение
В DDD объект домена не заботится о своей сохраняемости.У вас не должно быть Save()
метод на нем, в идеале.
В вашем репозитории будет такой Save
метод, который принимает экземпляр объекта в параметре:
public class PersonRepository
{
//...
public void Save(Person person)
{
this.dataContext.Save(person);
}
//...
}
В зависимости от вашего стека ORM будет обрабатывать сохранение объекта, или вы закончите созданием запроса для сохранения пользователя, или вы заполните параметры хранимой процедуры значениями из вашего экземпляра и т.д.
Если я правильно понял, что вы сделали, возможно, потребуется переместить логику сохранения, которую вы поместили в объекты домена, в другое место, возможно, в репозитории или в DAL, используемый вашими репозиториями.
Другие советы
Используете ли вы Агрегированные корни?Они несут ответственность за спасение своих сущностей.
Если происходит много изменений, одним из способов может быть инкапсулирование этой логики в службу домена и заставить службу обрабатывать сохранения через корни Aggregate.