将依赖项(NLog)注入动态加载的类型

时间:2011-11-30 13:19:57

标签: c# dependency-injection dynamic nlog plugin-architecture

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

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

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

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

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

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

这是可能的,还是有一种首选方式来完成这样的事情? 感谢

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:1)

查看Unity或Lightcore等依赖注入容器。

他们是某种“组件注册商店”

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

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

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

例如,当他们创建新实例并且您具有复杂类型作为ctor参数时,如果这些组件已注册,则可以自动查找,然后自动注入它们。

可以帮助您的一些关键字是“ServiceLocator”“MicroKernel”“Depency Injection”

组件: