如何为动态加载的程序集注入依赖项

时间:2013-12-19 23:05:31

标签: c# reflection dependency-injection ioc-container

我有一个管理器类,通过反射加载包含在单独程序集中的各种插件模块。这些模块是与外界的通信(WebAPI,各种其他Web协议)。

public class Manager
{
   public ILogger Logger; // Modules need to access this.

   private void LoadAssemblies()
   {
     // Load assemblies through reflection.
   }
}

这些插件模块必须与manager类中包含的对象进行通信。我该如何实现呢?我考虑过使用依赖注入/ IoC容器,但是如何在程序集中执行此操作?

我所拥有的另一个想法是让模块引用一个包含所需资源的静态类。

我感谢任何建设性意见/建议。

1 个答案:

答案 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()注册以通过已知接口检索插件,或者键入以通过某个关键对象检索插件(例如,串))。