我有一个管理器类,通过反射加载包含在单独程序集中的各种插件模块。这些模块是与外界的通信(WebAPI,各种其他Web协议)。
public class Manager
{
public ILogger Logger; // Modules need to access this.
private void LoadAssemblies()
{
// Load assemblies through reflection.
}
}
这些插件模块必须与manager类中包含的对象进行通信。我该如何实现呢?我考虑过使用依赖注入/ IoC容器,但是如何在程序集中执行此操作?
我所拥有的另一个想法是让模块引用一个包含所需资源的静态类。
我感谢任何建设性意见/建议。
答案 0 :(得分:0)
大多数ioc容器应该支持这一点。例如,使用autofac,您可能会这样做:
// in another assembly
class plugin {
// take in required services in the constructor
public plugin(ILogger logger) { ... }
}
var cb = new ContainerBuilder();
// register services which the plugins will depend on
cb.Register(cc => new Logger()).As<ILogger>();
var types = // load types
foreach (var type in types) {
cb.RegisterType(type); // logger will be injected
}
var container = cb.Build();
// to retrieve instances of the plugin
var plugin = cb.Resolve(pluginType);
根据应用程序的其余部分将如何调用插件,您可以适当地更改注册(例如,使用AsImplementedInterfaces()注册以通过已知接口检索插件,或者键入以通过某个关键对象检索插件(例如,串))。