4

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

最初我通过加载插件Assembly.LoadFrom(fi.FullName).GetTypes() 并通过(IPlugin)Activator.CreateInstance(type);.

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

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

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

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

这是可能的还是有一个首选的方法来完成这样的事情?谢谢

4

2 回答 2

3

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

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

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

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

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

于 2011-12-02T10:05:28.983 回答
1

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

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

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

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

因此,您可以轻松更改映射。

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

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

组件:

于 2011-11-30T13:30:16.757 回答