我有一个由IFoo
实施的DefaultFoo
服务,我已经在我的autofac容器中注册了它。
现在我想允许在插件程序集中实现IFoo
的替代实现,可以将其放在“plugins”文件夹中。如果它存在,如何配置autofac以更喜欢这个替代实现?
答案 0 :(得分:15)
如果您注册了一些接口实现,Autofac将使用最新的注册。其他注册将被覆盖。在您的情况下,如果存在插件并且注册自己的IFoo服务实现,Autofac将使用插件注册。
如果多个组件公开同一服务,Autofac将使用最后注册的组件作为该服务的默认提供者。
答案 1 :(得分: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);