注入依赖(NLog)到动态加载的类型中

本文关键字:加载 类型 动态 依赖 NLog 注入 | 更新日期: 2023-09-27 18:16:07

在我的解决方案中有一种插件架构。有一个众所周知的文件夹,在那里放置插件。这个插件实现了一个在主机项目中共享的接口。

最初我通过Assembly.LoadFrom(fi.FullName).GetTypes()加载插件并通过(IPlugin)Activator.CreateInstance(type);实例化所需的类型。

因此主机(主应用程序)可以执行插件程序集实现的适当代码。

但最近我尝试通过NLog实现应用程序日志记录,并在主机项目中配置了NLog,效果很好。

问题是我想在插件程序集中使用(已经配置的)日志记录器。如果我只是参考NLog并通过LogManager.GetCurrentClassLogger();使用它,似乎没有配置集。它不会记录到我在插件程序集之外的主机项目中配置的文件。

我想尝试注入一个NLogger实例(在主机项目中创建)到插件类型的属性。

这是可能的还是有更好的方法来完成这样的事情?由于

注入依赖(NLog)到动态加载的类型中

这应该工作- NLog配置也应该为加载的插件程序集工作。这个问题可能与你的插件加载方式有关。也许它们在一个单独的域中(我不记得它是如何工作的),所以NLog不能访问你的主应用程序的日志配置。

在这种情况下,你可以尝试为你的插件程序集添加单独的nlog配置文件(阅读关于配置文件命名约定的nlog文档)。

我不认为IOC容器会在动态加载插件的情况下帮助你——容器不会知道它们,所以你必须改变插件加载和配置的方式。我认为使用IOC来配置nlog并不是一个好主意。

如果前面的选项不起作用,你可以尝试在app.config中改变程序集探测路径,这样你的插件就会被加载到默认域中,那么NLog应该可以为这些插件工作(至少对我来说是这样):

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <probing privatePath="Plugins" />
</assemblyBinding>

看看像Unity或Lightcore这样的依赖注入容器。

它们是某种"组件注册存储"

可以将组件注册到接口。然后你的消费者只需要请求一个接口。

接口-组件的映射可以在配置文件或源代码中进行。

所以你可以毫不费力地改变映射。

例如,当它们创建新实例时,如果您使用复杂类型作为参数,它们可以自动查找这些组件是否已注册,然后自动注入它们。

可以帮助你的关键字是"ServiceLocator" "MicroKernel" " dependency Injection"

组件:

  • Lightcore
  • 统一
  • MEF 也是一个更以插件为中心的方式