репозитории объектов в методах бизнес-объектов - PullRequest
1 голос
/ 11 февраля 2011

В прошлом я думал, что мои доменные объекты не должны содержать вызовов репозиториев в своем методе.Однако я столкнулся со следующей проблемой.Я знаю, что доменные объекты должны быть всегда в интегрированном состоянии.Например, если у вас есть правило, что Order не может существовать без строки заказа, вам нужно добавить orderLine в конструктор заказов и сделать коллекцию LineOrder доступной только для чтения.

В моем случае, если заказ переходит в состояние «Утверждено», мне нужно проверитьесли у Клиента достаточно денег для заказа и если приложение может сделать переводы для этого клиента, а затем связать перевод с заказом.Поэтому мой метод order.Approve требует вызова соответствующих методов репозиториев, чтобы проверить, можно ли утвердить заказ и получить необходимые свойства навигации (Order - Transfer Ассоциации).

Если я не выполняю эту проверку и присваивания в методе Approve и создаю метод Approve в классе OrderService (так как Approve может рассматриваться как процесс), то мой метод Approve может привести объект к неинтегрированному состоянию, если кто-то вызоветэто в другой части кода.

Итак, мои вопросы: 1. Если использование методов хранилища в доменных объектах неправильно, то как решить проблему целостности объекта выше?2. Если Подтвердить не является процессом, то каков процесс у клиента, образец заказа?:)

Ответы [ 2 ]

3 голосов
/ 11 февраля 2011

Возможно, вам следует принять во внимание, что один объект может иметь несколько контекстов проверки.

Ответы на ваш вопрос: 1) Вы не должны использовать репозитории внутри моделей вашего домена. 2) Утверждение больше похоже на проблему, связанную с обслуживанием, а не на ваш заказ.

0 голосов
/ 11 февраля 2011

NHibernate и EntitiFramework решают эту проблему путем ленивой загрузки (по запросу) необходимых подпунктов.

Пример

 foreach(var transfer in myOrder.Customer.Transfers)

При доступе к myOrder.Customer объект клиента загружается из базы данных.

При доступе к myOrder.Customer.Transfers коллекция трансферов загружается из базы данных.

Таким образом, нет необходимости обращаться к хранилищу.

Вот пример того, как нужнохранилище в бизнес-методе можно исключить: как создать полностью инкапсулированные доменные модели .

...