我有DefaultFoo
實現的IFoo
服務,我在我的autofac容器註冊它是這樣。覆蓋autofac登記插件
現在我想允許在插件程序集中實現IFoo
的替代實現,該程序集可以放在「插件」文件夾中。如果配置autofac如果存在,那麼如何配置這個替代實現?
我有DefaultFoo
實現的IFoo
服務,我在我的autofac容器註冊它是這樣。覆蓋autofac登記插件
現在我想允許在插件程序集中實現IFoo
的替代實現,該程序集可以放在「插件」文件夾中。如果配置autofac如果存在,那麼如何配置這個替代實現?
如果您註冊了一些接口實現,Autofac將使用最新的註冊。其他註冊將被覆蓋。在你的情況下,如果插件存在並註冊自己的IFoo服務實現,Autofac將使用插件註冊。
如果超過一個組件公開相同的服務,Autofac將使用最後註冊組件作爲該服務的默認提供商。
如前所述由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);
這是用於測試超級有用,因爲它允許重寫與他們同行_test_ _default_註冊。 – t3chb0t
這是與Autofac預期的行爲,還是隻是巧合?你有任何參考? –
這表明它是預期的: http://docs.autofac.org/en/latest/register/registration.html#default-registrations –
請注意,其他註冊未被覆蓋! Autofac將只使用最後一個註冊的組件,但以前的組件還是可以解決的(解決>爲例) –