2013-04-02 114 views
11

我有DefaultFoo實現的IFoo服務,我在我的autofac容器註冊它是這樣。覆蓋autofac登記插件

現在我想允許在插件程序集中實現IFoo的替代實現,該程序集可以放在「插件」文件夾中。如果配置autofac如果存在,那麼如何配置這個替代實現?

回答

11

如果您註冊了一些接口實現,Autofac將使用最新的註冊。其他註冊將被覆蓋。在你的情況下,如果插件存在並註冊自己的IFoo服務實現,Autofac將使用插件註冊。

如果超過一個組件公開相同的服務,Autofac將使用最後註冊組件作爲該服務的默認提供商。

Default Registrations

+0

這是與Autofac預期的行爲,還是隻是巧合?你有任何參考? –

+2

這表明它是預期的: http://docs.autofac.org/en/latest/register/registration.html#default-registrations –

+1

請注意,其他註冊未被覆蓋! Autofac將只使用最後一個註冊的組件,但以前的組件還是可以解決的(解決>爲例) –

1

如前所述由Memoizer,最新的註冊將覆蓋前面的。我結束了這樣的事情:

// gather plugin assemblies 
string applicationPath = Path.GetDirectoryName(
    Assembly.GetEntryAssembly().Location); 
string pluginsPath = Path.Combine(applicationPath, "plugins"); 
Assembly[] pluginAssemblies = 
    Directory.EnumerateFiles(pluginsPath, "*.dll") 
    .Select(path => Assembly.LoadFile(path)) 
    .ToArray(); 

// register types 
var builder = new ContainerBuilder(); 
builder.Register<IFoo>(context => new DefaultFoo()); 
builder.RegisterAssemblyTypes(pluginAssemblies) 
    .Where(type => type.IsAssignableTo<IFoo>()) 
    .As<IFoo>(); 

// test which IFoo implementation is selected 
var container = builder.Build(); 
IFoo foo = container.Resolve<IFoo>(); 
Console.WriteLine(foo.GetType().FullName); 
+0

這是用於測試超級有用,因爲它允許重寫與他們同行_test_ _default_註冊。 – t3chb0t