Событие инициализации домена DDD / первый запуск приложения - PullRequest
0 голосов
/ 01 июля 2019

В последнее время я борюсь с реализацией логики 'init' моего приложения DDD.

У меня есть сервисы, которые должны быть инициализированы с конкретными значениями, чтобы больше бороться, скажем, я бы хотелв будущем, чтобы инициализировать некоторые агрегаты при первом запуске приложения.

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

Самая большая проблема в том, что я не уверен, гдея поместил этот тип запуска / инициализации, похоже, что он должен находиться на уровне инфраструктуры.

Большое спасибо:)

Ответы [ 2 ]

2 голосов
/ 01 июля 2019

Я недостаточно знаю об Аксоне, но сама проблема носит общий характер, а последующее - общее решение.

Шаблон, который вы ищете: Composition Root.

Корень компоновки - это (предпочтительно) уникальное место в приложении, где модули составляются вместе.

Это точка входа в ваше приложение, где происходит «составление графов объектов». Графы объектов - это просто группа (ы) объектов, с или без связей между ними.

Как правило, в Java и .NET вы использовали бы контейнер внедрения зависимости для выполнения этой композиции. Но точный механизм не важен; это может быть использование контейнера или это может быть сделано вручную, используя чистый DI с центральным объектом.

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

Корень композиции - это компонент инфраструктуры приложения.

Это означает, что только приложения должны иметь корни композиции. Библиотеки и рамки не должны. Кроме того, при построении графов объектов корень композиции обычно ссылается на конфигурации и вводит правильные внешние зависимости в объекты.

compose график объекта как можно ближе к точке входа приложения.

Это означает, что весь код вашего приложения основан исключительно на внедрении конструктора или поиске домена (или других шаблонах внедрения) и никогда не составляется в режиме ad-hoc. Только в точке входа приложения может быть составлен весь граф объектов.

В зависимости от вашего приложения эта точка входа может быть:

  • Основной метод в консольных приложениях
  • run методы или методы запуска, предоставляемые серверами приложений (на таких языках, как Ruby и Python)
  • global.asax и пользовательский IControllerFactory, в приложениях ASP.NET MVC
  • Метод Application.OnStartup в приложениях WPF
  • Пользовательский ServiceHostFactory в WCF
  • и т. Д.

Материал для чтения:

2 голосов
/ 01 июля 2019

Я думаю, что лично у меня есть команда, предназначенная для этого «первого запуска приложения».После этого у вас будет компонент обработки команд, единственная цель которого состоит в том, чтобы решить, является ли это первым запуском вашего приложения.

Если да, то вы запускаете последующие команды для запуска некоторых других операций.Если нет, вы полностью проигнорируете команду, возможно, зарегистрируете, что инициализация была отклонена.Чтобы принять это решение, вам, конечно, нужно иметь это состояние где-то.Как и где это хранится, зависит от вас, хотя в целом я бы сказал, что вы должны использовать лучший инструмент для решения этой проблемы.Агрегат инициализации, например, , не будет правильным местом, так как это введет что-то вроде системного агрегата.Я предпочел бы иметь очень простую выделенную модель запроса для данной задачи, но это моя догадка с учетом контекста вопроса.

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

Это мои два цента в этой ситуации, надеюсь, это поможет @PolishCivil!

...