В настоящее время я разрабатываю довольно разумные приложения для клиента в индустрии путешествий с использованием .net и nhibernate, и я придумываю несколько проблем с внедрением DDD и разногласия в команде по наилучшему пути. Я надеюсь, кто-то может предложить некоторые рекомендации.DDD, инкапсуляция и многоуровневая архитектура: мой домен слишком анемичен?
На данный момент мы внедрили сервисный уровень за пределами домена, с сервисом на каждый агрегатный корень ([EntityName] Service). Все остальные слои используют эти службы для получения ссылок на общий корень с помощью методов GetByThis() и GetByTheOther(). Все наши вызовы в домен из других слоев осуществляются через эти службы.
Услуги содержат ссылки на репозитории (которые больше нигде не упоминаются), а также отвечают за все поведение сохранения/обновления и управление транзакцией. Методы обслуживания растут по сложности и иногда имеют поведение, которое, по-видимому, принадлежит домену, например логика условного создания (если свойство = этот набор дочерних объектов что-то указывает, в противном случае что-то еще). Наши объекты домена имеют в основном простые методы, такие как GetByThis() и HasAThing(). Я чувствую, что мы теряем выразительность нашего домена.
Мои основные вопросы:
- Если уровень службы содержат так много логики? если нет, то где следует ? если домен должен заполнить корни ссылками на репозиториев? если да, то как они могут быть введены (в фабрики , которые создают совокупные корни?)
- Как обрабатывать транзакцию?
- Если сущности (или совокупные корни) содержат ссылки на домен услуг? Если да, то как они должны получить ссылки?
- Чтобы получить новый идентификатор для объекта, мы должны вызвать хранимую процедуру, которую мы завернули в репозиторий. Где вы бы указали это? Некоторые сложные методы для Entities, которые нуждаются в для создания множества дочерних объектов, должны будут ссылаться на это?
EDIT
Спасибо за Продуманная ответы @ DAVID-мастеров и @ guillaume31.
Вы помогли мне решить, что «вонючий код» чувствует, что я получаю.
Во-первых, я должен был сказать, что у нас есть (очень) устаревшая DB оракула, чтобы конкурировать с ним, следовательно требование Id Generation (среди других проблем).
Для кого-то, кто смотрит на это, оба ответа дали отличный совет, но для меня это был лучший совет:
«С прагматической точки зрения, вот что я хотел бы спросить себя: если я хочу взять часть моего уровня домена и повторное использование его в другом приложении, будет ли он содержать все бизнес-правила и поведение, которые мне нужны для использования домена в этом новом приложении? Если нет, то, возможно, это означает, что некоторые части, которые в настоящее время находятся на стороне приложения, должны быть перемещены на уровень домена.»
Я пересмотрела наш домен и сервисный слой с этим в виду, и теперь считаю, я решил наши проблемы проектирования