Внедрить зависимости (NLog) в динамически загружаемые типы
У меня есть своего рода архитектура плагинов в моем решении. Существует хорошо известная папка, в которой размещаются плагины. Плагины реализуют интерфейс, который используется в проекте хоста.
Изначально я загружаю плагин через Assembly.LoadFrom(fi.FullName).GetTypes()
и создать нужный тип (IPlugin)Activator.CreateInstance(type);
,
Таким образом, хост (основное приложение) может выполнять соответствующий код, реализованный сборкой плагина. Это работает отлично до сих пор.
Но недавно я попытался реализовать регистрацию приложений через NLog и настроил NLog в хост-проекте, который работал отлично.
Проблема в том, что я хотел бы использовать (уже настроенный) регистратор в сборке плагина. Если я просто ссылаюсь на NLog и использую его LogManager.GetCurrentClassLogger();
Кажется, здесь нет набора настроек. Он не регистрирует файлы, которые я настроил в хост-проекте из сборки плагина.
Я подумал о том, чтобы попытаться внедрить экземпляр NLogger (созданный в хост-проекте) в свойство типа плагина.
Возможно ли это или есть предпочтительный способ выполнения таких вещей? Спасибо
2 ответа
Это должно работать - конфигурация NLog должна работать и для загруженных сборок плагинов. Проблема, вероятно, связана с тем, как загружаются ваши плагины. Возможно, они находятся в отдельном домене (я не помню, как это работает), поэтому NLog не может получить доступ к конфигурации регистрации ваших основных приложений.
В этом случае вы можете попробовать добавить отдельные файлы конфигурации nlog для ваших сборок плагинов (прочитайте документацию nlog о соглашениях об именах файлов конфигурации).
Я не думаю, что контейнер IOC поможет вам в случае динамически загружаемых плагинов - контейнер не будет знать о них, поэтому вам придется изменить способ загрузки и настройки плагинов. И imho использовать IOC для настройки nlog не очень хорошая идея.
Если предыдущие опции не работают, вы можете попробовать изменить путь проверки сборки в app.config, чтобы ваши плагины загружались в домен по умолчанию - тогда NLog должен работать для этих плагинов (по крайней мере, для меня):
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Plugins" />
</assemblyBinding>
Взгляните на контейнеры для инъекций зависимости, такие как Unity или Lightcore.
Это своего рода "магазины регистрации компонентов"
там вы можете зарегистрировать компоненты для интерфейсов. Тогда ваши потребители просто должны запросить интерфейс.
Отображение интерфейса - компонента может быть сделано в конфигурационных файлах или исходном коде.
Таким образом, вы можете изменить отображение без какой-либо боли.
Например, когда они создают новые экземпляры и у вас есть сложные типы в качестве параметров ctor, они могут выполнить автоматический поиск, если эти компоненты зарегистрированы, а затем внедрить их автоматически.
Вот некоторые ключевые слова, которые могут вам помочь: "ServiceLocator", "MicroKernel", "Depency Injection"
Компоненты: