Я немного читал DDD, и я смущен тем, как это будет соответствовать при использовании ORM, например, NHibernate.Можно использовать чистый DDD-подход с NHibernate?
Прямо сейчас у меня есть приложение .NET MVC с довольно «живыми» контроллерами, и я пытаюсь выяснить, как лучше всего это исправить. Перемещение этой бизнес-логики в слой модели было бы лучшим способом сделать это, но я не уверен, как это можно сделать.
Мое приложение настроено таким образом, что сеанс NHibernate управляется HttpModule (получает сеанс/транзакцию с моего пути), который используется репозиториями, возвращающими объекты сущности (Think S # arp arch ... получается в действительности это дублирует много их функциональных возможностей). Эти репозитории используются DataServices, которые прямо сейчас являются обертками вокруг репозиториев (взаимно однозначное сопоставление между ними, например UserDataService принимает UserRepository или фактически репозиторий). Эти DataServices прямо сейчас гарантируют, что аннотации данных, украшающие классы сущностей, проверяются при сохранении/обновлении.
Таким образом, мои объекты на самом деле являются объектами данных, но не содержат никакой реальной логики. Хотя я мог бы поместить некоторые вещи в классы сущностей (например, метод «Утвердить»), когда это действие должно выполнить что-то вроде отправки электронной почты или касания других несвязанных объектов или, например, проверки, чтобы увидеть, есть пользователи, которые имеют одинаковое электронное письмо перед утверждением и т. д., тогда сущности потребуется доступ к другим репозиториям и т. д. Ввод данных с помощью IoC не будет работать с NHibernate, поэтому вам придется использовать фабрику Я предполагаю получить их. Я не понимаю, как вы могли бы издеваться над темистами.
Итак, следующий наиболее логичный способ сделать это, я думаю, состоял бы в том, чтобы по существу иметь службу на контроллер и извлекать всю работу, выполняемую в контроллере, в настоящее время в методы каждой службы. Я бы подумал, что это ломается с идеей DDD, хотя, поскольку логика теперь больше не содержится в реальных объектах модели.
Другой способ взглянуть на это, я думаю, что каждая из этих служб образует единую модель с объектом данных, с которым она работает (разделение полей хранения данных и логики, которая работает на нем), но я просто хотел чтобы увидеть, что делают другие, чтобы решить проблему «живого контроллера» с помощью DDD, используя ORM, например NHibernate, который работает, возвращая заполненные объекты данных и модель репозитория.
Обновлено Я думаю, что моя проблема в том, как я смотрю на это: NHibernate, кажется, поставить бизнес-объекты (сущности) в нижней части стека, который репозиториях затем действовать дальше. Репозитории используются службами, которые могут использовать несколько репозиториев и другие службы (электронная почта, доступ к файлам) для выполнения действий. Т.е.: Приложение> Услуги> Репозитории> Бизнес-объекты
Чистый подход DDD, который я читаю, по-видимому, отражает смещение Active Record, где функции CRUD существуют в бизнес-объектах (это я вызываю User.Delete непосредственно вместо Repository.Delete из службы), а фактический бизнес-объект обрабатывает логику вещей, которые должны выполняться в этом экземпляре (например, отправка по электронной почте пользователя и удаление файлов, принадлежащих пользователю, и т. Д.). То есть Приложение> (Сервисы)> Бизнес-объекты> Репозитории
С NHibernate, кажется, мне было бы лучше использовать первый подход, учитывая функции NHibernate, и я ищу подтверждение по моей логике. Или, если я просто смущен, некоторые разъяснения о том, как должен работать этот многоуровневый подход. Я понимаю, что если у меня есть метод «Утвердить», который обновляет модель User, сохраняется и, скажем, посылает несколько сообщений нескольким людям, что этот метод должен идти на объект объекта User, но для обеспечения надлежащего IoC, чтобы я мог введите messagingService, мне нужно сделать это на моем уровне обслуживания, а не на объекте User.
С точки зрения «множественного UI» это имеет смысл, так как логика делать вещи выведена из моего уровня пользовательского интерфейса (MVC) и помещается в эти сервисы ... но я по сути просто факторинга логика в другой класс вместо того, чтобы делать это непосредственно в контроллере, и если у меня не будет никакого другого интерфейса, я просто торгую «жирным контроллером» для «толстой службы», поскольку служба по существу, собирается инкапсулировать метод на каждое действие контроллера для выполнения его работы.
Я не уверен, что «чистый подход DDD» отражает активное смещение записи. Это явно не похоже на все, что я помню в книге Эрика Эванса. Какой источник вы используете, что предполагает, что объекты используют ActiveRecord? – JasonTrue
Для чего это стоит, вы можете использовать Castle ActiveRecord, если хотите, чтобы Nhibernate использовал ActiveRecord вместо подхода DDD. – JasonTrue