Пурист (я стараюсь оставаться чистым) расскажет вам, что ваша модель представляет ваши данные. И поэтому все, что нужно сохранить, делается только тогда, когда это необходимо через репозитории. Кроме того, когда у вас есть сложные объекты, вы хотите использовать службу для их объединения. Например, объект User + Employee = UserEmployee, доступный только через IUserEmployeeService.
С этими неопределенными заявлениями у вас есть прекрасная возможность здесь.
Создайте слой с антикоррупцией, который позволит вам одновременно перейти к устаревшей БД.
Это еще одна глава в игровой книге DDD. Уровень Anti-Corruption используется для взаимодействия с устаревшей системой, использующей Facades, Translators и Adapters, чтобы изолировать устаревшую БД с помощью вашей чистой модели домена.
Теперь это может быть намного больше работы, чем вы хотели. Таким образом, вы должны спросить себя в этот момент:
Хочу ли я, чтобы начать процесс трогания этого наследия БД, или это останется для жизни приложения?
Если вы ответите, что можете начать миграцию, то смоделируйте свой фактический домен так, как вы этого хотите. Сохраняйте его с помощью обычных хранилищ и служб. Получайте удовольствие, проектируя его так, как вы хотите его сохранить.Затем используйте службы совокупных корней, чтобы достичь уровня защиты от коррупции и вытащить сущности, сохранить/обновить их локально и перевести в сущности вашего домена.
Если ответ заключается в том, что устаревшая БД останется на весь срок службы проекта, тогда ваша задача будет намного проще. Используйте службы своего домена (например, UserEmployeeService) для доступа к пользовательскомуFacade и EmployeeFacade антикоррупции (аналогично концепции «Удаленная служба»).
Внутри фасадов вы можете получить доступ к устаревшему DB с помощью адаптеров (например, LegacyDbSqlDatabase), чтобы получить сырое legacyUser(). Следующим шагом будет использование UserTranslator() и EmployeeTranslator() mapper, который преобразует устаревшие пользовательские данные в версию вашего действительного домена объекта User() и возвращает его из UserFacade обратно в UserEmployeeService, где он сочетается с объект Employee, который пришел из того же места.
Вау, это было много печатать ...
С вашими адаптерами и фасадов вашего слоя Антикоррупционного, вы можете сделать ваш Linq к Sql или что вы хотите сделать. Это не имеет значения, потому что вы полностью изолировали устаревшую систему БД/от вашего чистого и чистого домена - своего домена, у которого есть собственная версия объектов User() и Employee() и объектов ценности.