Хм, ИМХО DDD не столько о «наслоении».
Это больше о моделировании проблемы, которую вы пытаетесь решить, чтобы ваша модель (сущности, объекты значений, репозитории, сервисы, спецификации) отражала проблемную область реального мира.
Однако действительно существует какое-то «разделение» между классами, которые вы пишете, но я бы на самом деле не назвал это «многоуровневым», так как ИМХО, совершенно нормально, что ваши классы представления и доменные классы имеют доступ инфраструктура, например.
Тем не менее, доменные классы не должны зависеть, например, от классов представления, но обратное может быть истинным.
Я в основном организовываю свои проекты следующим образом:
- a имеет сборку, которая содержит материалы, относящиеся к презентации. (Формы и т.д ...)
- У меня есть сборка, которая содержит «домен». Это включает в себя объекты, хранилище
интерфейсы, классы спецификаций и т.д ...
- другая сборка, которая содержит реализации репозитория.
- набор инфраструктурных сборок:
- общий dll 'framework', который содержит утилиты, которые я могу использовать в своей презентации, в своих классах домена и т. Д. *
- dll, который содержит помощников для доступа к БД (в моем случае, тонкая оболочка вокруг NHibernate).
Вопреки тому, что говорит Натан Хьюз, я думаю, что это нормально, что у вашего уровня представления есть доступ к инфраструктуре, так как я иногда опускаю «уровень обслуживания приложений». В таком случае мой уровень представления - это мое приложение.
Я также использую NHibernate, и для меня нормально, что мой уровень презентации обращается к помощникам NHibernate. Поскольку мое приложение (в некоторых случаях это мой уровень представления) является единственной «вещью», которая знает контекст приложения. Так, например, именно он отвечает за запуск и совершение транзакций.
(Как говорит Эванс в главе 5, я думаю: контекст - это король).