DDD / DI (Unity) / .NET / Root Composition - доменные службы - PullRequest
8 голосов
/ 04 ноября 2011

У меня есть стандартная настройка Order / OrderLineItem.

В течение дня генерируется количество Возвратных сумм, которые сохраняются в течение дня, Возврат состоит из Идентификатора заказа и 1 или более LineItemId.Мне нужно объединить их (в Службе Windows) в конце дня, чтобы возместить кредитные карты, подарочные карты, карты вознаграждений и т. Д. В зависимости от ситуации.

Я читал Книга Марка Симанна и вижу преимущество использования корня композиции для нарастания графа объекта.

Сам процесс консолидации - это то место, где мне нужно сделать больше всего композиции.

Чего я не понимаю, так это то, где должна заканчиваться эта логика консолидации?Могу ли я предположить, что независимо от того, где заканчивается логика консолидации, я все еще использую только что-то вроде Unity в корне композиции, и эта композиция должна произойти очень рано?

Рад предоставить больше информации или уточнить, в зависимости от обстоятельств!

Ответы [ 2 ]

3 голосов
/ 04 ноября 2011

Сам процесс консолидации - это то, где мне нужно больше всего составить.

Итак, вы имеете в виду, что процесс создания данных в вашей системе - это то, где будет создаваться большинство доменных объектов?

Это имеет смысл и соответствует большинству приложений.

Чего я не понимаю, так это то, где должна заканчиваться эта логика консолидации?

Логика консолидации будет обеспечиваться одним или несколькими сервисными компонентами, которые, вероятно, используют один или несколько репозитариев компонентов и один или несколько компонентов работы компонентов. Этот сервис будет скомпонован в корне композиции, как и любые репозитории / единицы работы, которые вы в итоге создадите.

Данные сами по себе полностью динамические. Вы не можете структурировать свое приложение так, чтобы статически знать расположение данных, поэтому вы не можете создать его в корне композиции. И вы не должны пытаться. Вместо этого ваш код может использовать ORM для определения или сопоставления с реляционной схемой между объектами данных вашего домена.

Затем вы можете использовать репозиторий / единицу работы для извлечения данных из хранилища. Вы также используете свой пользовательский интерфейс / службу для создания новых данных, используя new - в этом нет ничего постыдного для объектов домена, которые являются чисто данными и гарантированно не имеют никаких зависимостей. Сохранять новые или измененные данные в хранилище / единице работы.

Если это заставляет вас съеживаться, вы всегда можете использовать фабричный шаблон, который вводится из корня композиции для создания этих объектов. Но если вы структурировали доменные объекты низкого уровня так, чтобы они были DTO , это вам ничего не даст, если вообще что-то произойдет.

Так что вам не нужно использовать Unity для предоставления всего, и вам не нужно создавать абсолютно все объекты в вашей системе в корне композиции. Но вы должны попытаться создать статические части вашей системы или даже статически настраиваемые динамические части вашей системы в корне композиции. Это очень хорошо отображает DI-контейнеры, такие как Unity.

3 голосов
/ 04 ноября 2011

В случае, если ваши элементы Refund являются просто контейнерами данных или сущностями, которые не имеют каких-либо зависимостей от сервисов, вы можете просто создать экземпляр, используя new.

Если они имеют зависимости и должны быть созданы вашим контейнером IoC ивы не можете сделать при запуске, чем вы хотите использовать заводской интерфейс.Этот фабричный интерфейс содержит метод CreateRefund, принимающий все обязательные параметры, которые вы хотите передать созданному экземпляру.Этот интерфейс определен в пространстве имен / сборке его потребителя.

Реализация этого интерфейса зависит от контейнера IoC.Некоторые контейнеры предоставляют функциональность, заключающуюся в том, что интерфейс автоматически реализуется контейнером, просто указав его в конфигурации.Другие, такие как Unity, требуют ручной реализации.Эта реализация находится в корне композиции как часть конфигурации вашего контейнера.Позвольте реализации взять экземпляр контейнера и использовать его для создания запрошенного экземпляра Refund.

Таким образом, единственное место, где вы получаете доступ к контейнеру, находится в корне композиции.

...