В этом многое заключено, и большая часть ответа действительно зависит от вашего приложения и от того, как оно работает, поэтому нет конкретного ответа или руководства, которые могут быть предоставлены.Лучшие люди могут предложить предложения о том, как включить динамические вещи через DI, и надеемся, что вы сможете применить эти концепции к своему приложению.
Вы уже заметили, что Update
устарело, но есть многоруководства в этом вопросе о том, как сделать вещи более динамичными .Я бы посоветовал вам внимательно прочитать весь этот вопрос, так как описание обходных путей вверху, а также решение отдельных вопросов позже в этом выпуске помогут.
Загрузка сборок плагинов
Еслинабор сборок в вашем приложении меняется во время выполнения, вам, скорее всего, потребуется перестроить контейнер.Скорее всего, вы уже выполняете такие вещи, как запуск плагинов в дочерних процессах, поэтому домены приложений могут быть выгружены и перезагружены, вы решаете проблемы привязки сборок, когда в плагинах обнаруживаются разные версии зависимостей, и т. Д. Сборки плагинов уже являются проблемой;изменить во время выполнения - это ... ну, это очень сложный зверь.
Если вы меняете сборки плагинов во время выполнения, я бы порекомендовал перестроить контейнер изцарапина .В основном, перезапускаем биты логики запуска приложения, которые регистрируют вещи.Это означает, что ваши плагины будут использовать отдельный контейнер, чем приложение, в котором размещены вещи.В качестве альтернативы вы можете использовать дочернюю область действия на всю жизнь и регистрировать плагин на лету и притворяться, что дочерняя область является «контейнером», но это также может стать немного странным, когда вы начнете получать перенаправления связывания на лету и еще много чего.
Почему я говорю «перестроить»?
- Зависимости могут измениться: если вы добавите плагин, и набор зависимостей может измениться, это означает, что вы можете загрузить неверную версию зависимости вконтейнер, и вы получите сумасшедшие, трудно отлаживаемые ошибки, появляющиеся.
- Перечислимые могут измениться: если у вас есть что-то вроде «менеджера плагинов», который является одиночным, и он разрешает список всех плагинов, выпросто изменил это.Вам нужно сбросить синглтон и воссоздать его.Это означает сброс объема времени жизни, содержащего синглтон.
«Но, вы можете сказать:« У меня нет проблем с версионированием зависимостей! Я заставляю все мои плагины использовать одинаковые версии »! "
" Да, "я бы ответил:" Именно поэтому никто не может дать вам конкретное руководство. Именно поэтому могут быть внесены предложения, идеи могут быть предоставлены, но это будет на 100% дочтобы выяснить, что подходит для вашего приложения. "
Изменение конфигурации
В общем, я бы рекомендовал использовать две стратегии для конфигурации, которые могут измениться во время выполнения:
- Lambda-регистрации: Lambda-регистрации запускаются при каждом разрешении.Если значение может измениться во время выполнения, ответом может быть регистрация лямбды, которая каждый раз выполняет поиск конфигурации.Вы всегда получите последнее значение.
- Обработчики конфигурации, которые изменяются вне DI:
Microsoft.Extensions.Configuration
биты, которые обрабатывают, скажем, конфигурацию JSON, позволяют изменять файлы конфигурации JSON во время выполнения, и конфигурация перезагружается вчехлы.Это не часть DI, это часть системы конфигурации.В приемниках Microsoft.Extensions.Logging
также есть возможность предоставлять динамически настраиваемые фильтры журналов.Это тоже совершенно за пределами DI.Используйте эти вещи.Не кладите весь вес на свой контейнер IoC.
«Но, - скажете вы, - мне нужно изменить то, что влияет на все приложение! У меня есть динамическая конфигурация, которая должна изменитьпорты, на которых доступны службы, и это влияет на весь процесс хоста! "
"Да", я бы ответил: "Это потребует гораздо большего в плане пользовательского кодирования, и вам придется работать с этим. Для этого может потребоваться целый отдельный контейнер (один контейнер для запуска и одинконтейнер для «времени выполнения»). Это будет зависеть от приложения, и никто не может дать для этого конкретного руководства. "
Multitenancy
Поддержка Multitenant отлично подходит для вещей, отличающихся в зависимости от арендатора.Возможно, вы регистрируете разные обработчики сообщений (или что-то еще) для каждого арендатора.Потрясающие.Вы можете использовать вышеперечисленные концепции с мультитенансом так же легко, как и на уровне приложения.Вы можете «отбросить область действия арендатора», чтобы перенастроить ее во время выполнения, и это работает.Но имейте в виду, что если вы сделаете это, вам придется выполнить некоторую блокировку, чтобы гарантировать, что запросы, поступающие для этого арендатора, будут приостановлены, пока вы выполняете реконфигурацию.
Perf Note
Обычноговоря, контейнеры IoC оптимизированы для операций разрешения , а не операций сборки .Если вы ожидаете много оттока в области, попробуйте использовать лямбда-регистрации или сделать работу, чтобы избежать перестройки контейнера.