插入依赖项(NLog)到动态加载的类型

我的解决方案中有某种插件架构.
有一个著名的文件夹,可在其中放置插件.
插件实现了在宿主项目*享的接口.

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

因此,主机(主应用程序)可以执行由插件程序集实现的适当代码.到目前为止,这个工作正常.

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

问题是我想在插件程序集中使用(已配置的)记录器.
如果我只是引用NLog并通过LogManager.GetCurrentClassLogger();使用它;似乎没有配置设置.它不会从插件程序集登录到我在主机项目中配置的文件.

我想尝试将NLogger实例(在宿主项目中创建)注入到插件类型的属性中.

这是可能的还是有实现这种目标的首选方法?
谢谢

解决方法:

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

在这种情况下,您可以尝试为插件程序集添加单独的nlog配置文件(请参阅有关配置文件命名约定的nlog文档).

我认为IOC容器在动态加载插件的情况下不会帮助您-容器不会了解它们,因此您必须更改插件的加载和配置方式.恕我直言,使用IOC配置nlog并不是一个好主意.

如果先前的选项不起作用,您可以尝试更改app.config中的程序集探测路径,以便将插件加载到默认域中-那么NLog应该适用于这些插件(至少对我有用):

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <probing privatePath="Plugins" />
</assemblyBinding>
上一篇:.net core 2.1 Nlog.Web.AspNetCore


下一篇:Nlog日志组件简介