2012-02-06 45 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