注入依赖(NLog)到动态加载的类型中
本文关键字:加载 类型 动态 依赖 NLog 注入 | 更新日期: 2023-09-27 18:16:07
在我的解决方案中有一种插件架构。有一个众所周知的文件夹,在那里放置插件。这个插件实现了一个在主机项目中共享的接口。
最初我通过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这样的依赖注入容器。
它们是某种"组件注册存储"
可以将组件注册到接口。然后你的消费者只需要请求一个接口。
接口-组件的映射可以在配置文件或源代码中进行。
所以你可以毫不费力地改变映射。
例如,当它们创建新实例时,如果您使用复杂类型作为参数,它们可以自动查找这些组件是否已注册,然后自动注入它们。
可以帮助你的关键字是"ServiceLocator" "MicroKernel" " dependency Injection"
组件:
- Lightcore 统一MEF 也是一个更以插件为中心的方式