Я отказываюсь от традиционного DDD, который часто является огромным timewaster и заставляет меня делать бесконечное отображение: data layer <--> domain layer <--> presentation layer
.
Для даже небольшого изменения я должен изменить модели данных, модели домена, модели представления/режимы отображения, затем репозитории, классы менеджера/службы и, конечно, карты AutoMapper, а затем проверить все это! Каждый вызов требует вызова слоя, который вызывает слой, который вызывает базовый код. И я ничего не получаю взамен, кроме "вам может понадобиться это в будущем". Мех.
Мой текущий подход более прагматичен:
- Я больше не беспокоюсь о разнице между "уровнем данных" и "доменным слоем", поскольку нет смысла - термины взаимозаменяемы. Я позволяю EF делать это, и при необходимости добавлять интерфейсы и репозитории.
- Я объединил проекты "данные" и "домен" (в "ядро", скучное имя, я знаю), и я мог почти поклясться, что Visual Studio работает быстрее.
- Я разрешаю объектам EF идти вверх и вниз по стеку, но, как обычно, я все равно сопоставляю их с презентационными моделями/режимами просмотра.
- Для простых операций я вызываю репозитории непосредственно из контроллеров, для сложных операций я использую администраторы/службы домена, как обычно; Хранилища никогда не выставляют IQueryable.
- Я определяю сущности /POCOs как частичные классы, поэтому я могу добавлять поведение домена отдельно в соответствующие частичные классы.
Проблема: Теперь я использую сущности повсюду, поэтому клиентский код может видеть их свойства навигации. И модели всегда материализуются после того, как они покидают репозиторий, поэтому эти свойства навигации часто являются нулевыми.
Возможные решения:
1. Живи с ним. Это уродливо, но предпочтительнее проблем, описанных выше.
2. Для каждого объекта определите интерфейс, который скрывает свойства навигации; и заставить клиентский код использовать интерфейсы. Но, как это ни парадоксально, это означает еще один слой (хотя и тонкий и управляемый).
3. Что еще?
Я не привык к такого рода быстрому и свободному стилю программирования, поэтому, возможно, мне не хватает некоторых очевидных трюков. Есть ли что-нибудь еще, что я должен принять во внимание? Я уверен, что есть другие проблемы, с которыми я скоро столкнусь.
EDIT: Этот вопрос касается не DDD. И обратите внимание, что многие борются с традиционным подходом DDD - Кажется, что Seemann достигает того же вывода, Рахиен говорит о "Бесполезной абстракции за саму абстракцию" , и сам Эванс сказал, что DDD действительно полезен в 5% случаев. Также см. Эту тему. Некоторые из комментариев/ответов предсказуемо о том, как я делаю DDD неправильно, или как я могу настроить мою систему, чтобы сделать это правильно. Тем не менее, я не спрашиваю о DDD или избиении его для случаев, когда он подходит, скорее я хотел бы знать, что делают другие в соответствии с мышлением, которое я описал выше. Это не так, как если бы DDD был панацеей от всех проблем дизайна, каждое десятилетие выходит новый процесс (RUP - XP, Agile, Booch, blah...). DDD - это всего лишь самый новый, самый известный и используемый. Но прагматизм должен на первом месте, так как я пытаюсь построить товарную продукцию, поставляемую вовремя, и ее легко поддерживать. Самым полезным программным аксиомом, который я узнал, безусловно, является YAGNI. Я хочу изменить свою систему на своего рода "DDD-lite" , где я получаю сильную концепцию дизайна/OOP/шаблона, но без жира.