我的解决方案中有一种插件架构。有一个众所周知的文件夹,可以在其中放置插件。这些插件实现了一个在宿主项目中共享的接口。
最初,我通过Assembly.LoadFrom(fi.FullName).GetTypes()加载插件,并通过(IPlugin)Activator.CreateInstance(type);实例化所需的类型。
因此,宿主(主应用程序)可以执行由插件程序集实现的适当代码。到目前为止,它工作得很好。
但最近我尝试通过NLog实现应用程序日志,并在宿主项目中配置了NLog,效果很好。
问题是我想在插件程序集中使用(已经配置好的)记录器。如果我只是引用NLog并通过LogManager.GetCurrentClassLogger();使用它,似乎没有设置配置。它不会从插件程序集中记录到我在宿主项目中配置的文件。
我想尝试将NLogger实例(在宿主项目中创建)注入到plugin类型的属性中。
这是可能的吗?或者有更好的方式来完成这样的事情吗?谢谢
发布于 2011-12-02 18:05:29
这应该是可行的-- NLog配置也应该适用于加载的插件程序集。这个问题可能与插件的加载方式有关。也许它们在一个单独的域中(我不记得它是如何工作的),所以NLog不能访问您的主应用程序的日志配置。
在这种情况下,您可以尝试为您的插件程序集添加单独的nlog配置文件(请阅读有关配置文件命名约定的nlog文档)。
我认为IOC容器不会在动态加载插件的情况下帮助你-容器不会知道它们,所以你必须改变插件的加载和配置方式。imho使用IOC来配置nlog不是一个好主意。
如果前面的选项不起作用,你可以尝试在app.config中更改程序集探测路径,以便将插件加载到默认域中-然后NLog应该可以用于这些插件(至少对我来说是有效的):
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Plugins" />
</assemblyBinding>
发布于 2011-11-30 21:30:17
看看像Unity或Lightcore这样的依赖注入容器。
它们是某种“组件注册存储”
在那里,您可以将组件注册到接口。那么你的消费者只需要请求一个接口。
接口-组件的映射可以在配置文件或源代码中进行。
因此,您可以轻松地更改映射。
例如,当他们创建新的实例,并且您将复杂类型作为ctor参数时,如果这些组件已注册,他们可以进行自动查找,然后自动注入它们。
可以帮助你的关键字有"ServiceLocator“、"MicroKernel”、"Depency Injection“
组件:
MEF是一种更以插件为中心的
https://stackoverflow.com/questions/8326597
复制相似问题