так что было бы невозможно переключиться на другой ORM (не то, что мы хотели)).
Это кажется неправильным. Основное преимущество шаблона репозитория заключается в том, что вы скрываете логику доступа к данным и легко заменяемы.
До сих пор кажется, что я поместил свою бизнес-логику в свою модель предметной области и через репозитории я бы работал с ORM (который я когда-либо выбирал). Однако, если бы я хотел продолжать использовать инструмент MDA для части приложения ORM, созданная здесь модель была бы очень анемичной (то есть не содержала бы никакой бизнес-логики). Точно так же, если бы я использовал Entity Framework (.net) или NHibernate для моего ORM, это тоже было бы анемичной моделью. Я не уверен, куда бы вы положили бизнес-логику, если бы я просто использовал NHibernate.
Анемичная модель предметной области считается плохой практикой для многих, например, для Мартина Фаулера. Вы должны избегать такого дизайна, потому что такая модель ведет к методическим методам проектирования, а не к хорошему объектно-ориентированному дизайну. Затем у вас есть классы данных и классы менеджера / обработки, что означает, что вы разделяете состояние и поведение. Но объект действительно должен быть «состоянием и поведением».
NHibernate отлично справляется с невежеством. Вы можете скрыть детали отображения в XML или с помощью FluentNHibernate и просто написать простые POCO. С помощью NHibernate очень легко создать богатую модель предметной области. Я думаю, что вы можете сделать это с помощью структуры сущностей и инструмента MDA. Пока этот инструмент создает частичные классы, вы можете легко расширять сгенерированный код, не беспокоясь о том, что новое поколение может уничтожить ваш пользовательский код.
Короче говоря, эта длинная история. Когда вы используете NHibernate, ничто, я повторяю, ничего не мешает вам использовать модель богатого домена. Я рекомендую использовать его с FluentNHibernate и составлять карты вручную. Код сопоставления занимает всего 5-10 минут. Я полагаю, что то же самое верно для структуры сущностей и что ее инструменты по крайней мере создают частичные классы, которые легко расширяемы.
Правильно ли я так думать, другими словами, с DDD вся бизнес-логика в домене и просто использовать ORM для сохранения через репозитории?
По большей части вы правы. Вы должны иметь богатую модель предметной области. Особенно, когда вещи становятся все более и более сложными, легче поддерживать и расширять, если вы спроектировали это правильно. Но имейте в виду, что DDD также знает (на уровне домена и на уровне приложений) службы для реализации бизнес-логики и фабрики для инкапсуляции логики творчества.
Я также склонен дифференцировать бизнес-логику в предметную логику и бизнес-логику реального приложения. Логика домена - это то, как домен взаимодействует и ведет себя, в то время как логика приложения, которая представляет собой совершенно другой уровень, инкапсулирует, как домен используется для конкретного варианта использования / приложения. Часто мне приходится обновлять модель предметной области, чтобы поддерживать конкретные варианты использования и сделать ее более мощной.