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

最初我通过 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>

其他提示

看看依赖性注入容器,例如Unity或LightCore。

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

在那里您可以将组件注册到接口。然后,您的消费者只需要请求界面即可。

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

因此,您可以在没有任何痛苦的情况下更改映射。

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

一些可以帮助您的关键字是“ ServiceLocator”“ Microkernel”“降低注入”

成分:

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top