Создание приложения на основе плагинов с помощью Simple Injector - PullRequest
0 голосов
/ 08 июня 2018

Мне было дано задание написать техническую спецификацию (и позже внедрить) систему, которая будет построена на нескольких подмодулях.Подмодули будут разрабатываться частично параллельно, поэтому я бы очень хотел избежать перезапуска всей системы при каждом добавлении или обновлении плагина.Поскольку я уже использовал Simple Injector в другом проекте, я планирую использовать его для IoC в каждом подмодуле.Вместо того, чтобы вводить MEF (Managed Extensibility Framework) или MAF (Managed AddIn Framework) в ядро, связывающее модули вместе, я планирую посмотреть, можно ли использовать Simple Injector для обработки модулей.

Мой планиспользовать FileSystemWatcher для просмотра каталога плагинов, и когда обнаруживается изменение, либо используйте Simple Injector, либо, возможно, примените мое собственное решение.Я прочитал обсуждение здесь , но я считаю, что мой вариант использования отличается.

Требования:

  • Основная система работает как служба Windows и перезапускает все этовремени следует избегать
  • Каждый модуль отвечает за внутреннюю организацию работы, которую необходимо выполнить (что может быть много, поэтому необходимо не перезапускать все)
  • Вся системана основе событий.Модули будут отправлять события на шину событий, чтобы другие модули могли реагировать (делать свое дело) в зависимости от события.Модулям, однако, также будет разрешено делать что-то на регулярной основе.Один модуль Fx прослушивает новые файлы в каталоге, анализирует файл и помещает данные в базу данных.Другим модулям может потребоваться что-то сделать на основе этих новых данных.Другой модуль выполняет некоторые периодические вычисления.
  • Все модули будут иметь общий интерфейс IModule, который позволит базовой системе запускать и останавливать (удалять) модуль, возможно, вместе с методом регистрации шины событий, если я смогуНе найти другого способа обойти это
  • При перезапуске системы (перезапуск fx-сервера) ядро, конечно, должно быть в состоянии поднять все существующие модули

Чтобы иметь возможность динамическизагрузка / перезагрузка сборок Я планирую запустить каждый модуль в отдельном домене приложений.

Возможно ли это с помощью простого инжектора?Есть еще мысли?Возможно, что-то, о чем я не думал.

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Итак, основываясь на переписке со Стивеном, я решил посмотреть на альтернативы и поговорить с моим техническим директором.Это привело к совершенно другой архитектуре (микросервисы - возможно, реализованные как функции Azure), обменивающейся данными через шину сообщений (Azure Service Bus).Это соответствует всем требованиям и (с использованием функций Azure) гарантирует, что мы платим только за вычислительную мощность при возникновении событий, которые должны быть обработаны.

0 голосов
/ 08 июня 2018

Это не то, что облегчают DI-контейнеры.Они просто составляют графы объектов.Мне кажется, вам нужно запускать изолированные процессы или домены приложений (в противном случае их было бы невозможно перезагрузить).

Это означает, что DI-контейнер будет запускаться внутри рекламы этого изолированного домена (т.е. вашего модуля) в этом модуле., вы бы использовали свой контейнер, как вы всегда будете использовать его.С Simple Injector это не будет отличаться.

...