2012-02-06 51 views
11

我使用Autofac开始,要扫描的某些DLL的,并得到Autofac内他们注册一些类。Autofac扫描组件对某些类类型

,我很感兴趣,所有类从PluginBase类继承,但下面的代码似乎并没有被registerting他们。谁能帮忙?

 var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 


     var builder = new ContainerBuilder(); 
     builder.RegisterAssemblyTypes(assemblies) 
      .Where(t => t.BaseType == typeof(PluginBase)) 
      .AsImplementedInterfaces() 
      .AsSelf(); 

     var container = builder.Build(); 
     var pluginClasses = container.Resolve<IEnumerable<PluginBase>>(); 

     //pluginClasses is empty!!!! 

回答

18

我认为你需要指定基类上注册您的插件。呼叫AsImplementedInterfaces注册类型与其实施的接口,而不是它的基类型。您应该更新您的注册以将您的插件注册为PluginBase。

Here's代码:

var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 


    var builder = new ContainerBuilder(); 
    builder.RegisterAssemblyTypes(assemblies) 
     .Where(t => t.BaseType == typeof(PluginBase)) 
     .As<PluginBase>(); 

    var container = builder.Build(); 
    var pluginClasses = container.Resolve<IEnumerable<PluginBase>>(); 
+0

这工作!我可以添加AsImplementedInterfaces较新的类那是否实现接口? – Jon 2012-02-06 12:02:32

+0

我认为这两个调用应该一起工作。然后类型获得我注册ts基本类型及其实现的所有接口。 – Jehof 2012-02-06 12:05:35

+0

糟糕,只是重新阅读我写的内容,没有任何意义。如果我有一个从PluginBase继承的类,并且有一个接口的构造函数参数,那么即使使用AsImplementedInterfaces也不行。我是否会进行新的生成器注册,还是可以修改当前的代码? – Jon 2012-02-06 12:10:19

7

也许做的是这样的:

builder 
    .RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies()) 
    .Where(t => t.GetInterfaces() 
     .Any(i => i.IsAssignableFrom(typeof (IDependency)))) 
    .AsImplementedInterfaces() 
    .InstancePerDependency(); 

在这段代码中我使用IDependency作为一个标记接口。您可以用PluginBase类替换它,并删除Where方法。

点是使用IsAssignableFrom方法。

+0

意志,允许对于不实现接口和那些课程?我正在使用遗留代码,所以旧的东西不会有接口,但新的东西将 – Jon 2012-02-06 11:35:07

+0

它应该与'Where(t => t.IsAssignableFrom(typeof(PluginBase))''如果不是,我会尽力帮助你。 – Wojteq 2012-02-06 11:41:44

+0

它并不恐惧 – Jon 2012-02-06 11:45:17