Я создаю службу Windows с перезагружаемыми плагинами, используя .Net Core 3. Я начал с шаблона проекта Worker Service и добавил функцию плагинов, используя рекомендации в статье Microsoft Создание приложения .NET Core с плагинами . Мои плагины используют внешние зависимости, и все загружается нормально. Кроме того, мое решение может загружать / выгружать плагины без перезапуска службы, и пока все работает нормально. Теперь я хочу добавить параметры в конструктор плагинов (в данный момент конструктор плагинов меньше параметров), которые будут разрешены DI из службы, но безуспешно. Мне нужно пройти ex. ILogerFactory, DbContext для плагина с помощью инжектора конструктора.
Для создания экземпляра плагина я использую
ActivatorUtilities.CreateInstance(this._serviceProvider, pluginType)
this._serviceProvider - это параметр конструктора в методе, из которого создаются плагины, и он правильно разрешениз DI:
public TransformFile(ILogger<TransformFile> logger, IConfiguration configuration, IServiceProvider serviceProvider)
Если у меня есть такой конструктор плагинов
public TransformationPlugin(ILoggerFactory loggerFactory)
Исключение выдается
Unable to resolve service for type 'Microsoft.Extensions.Logging.ILoggerFactory' while attempting to activate 'Transformation.TransformationPlugin'.
Если у меня есть конструктор плагинов, подобный этому
public TransformationPlugin(IServiceProvider serviceProvider)
Я получаю serviceProvider с 45 зарегистрированными службами, но GetService возвращает значение NULL для каждой службы. Если я остановлю выполнение в конструкторе плагинов в Immediate Window, я смогу решить ex. ILoggerFactory. Я пытаюсь как с
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
, так и без него в плагине .csproj, но результат одинаков. Также в плагинах .csproj у меня есть <Private>false</Private>
для проекта, в котором определен интерфейс.