C# 使用插件覆盖autofac注册

C# 使用插件覆盖autofac注册,c#,dependency-injection,autofac,C#,Dependency Injection,Autofac,我有一个由DefaultFoo实现的IFoo服务,我已经在我的autofac容器中注册了它 现在我想允许在插件程序集中实现IFoo的另一种实现,它可以放在“plugins”文件夹中。如果存在此替代实现,如何配置autofac以使其更喜欢此替代实现?如果注册某些接口实现,autofac将使用最新注册。其他注册将被覆盖。在您的情况下,如果插件存在,Autofac将使用插件注册,并注册自己的IFoo服务实现 如果多个组件公开同一服务,Autofac将使用最后注册的组件作为该服务的默认提供程序 参见如M

我有一个由
DefaultFoo
实现的
IFoo
服务,我已经在我的autofac容器中注册了它


现在我想允许在插件程序集中实现
IFoo
的另一种实现,它可以放在“plugins”文件夹中。如果存在此替代实现,如何配置autofac以使其更喜欢此替代实现?

如果注册某些接口实现,autofac将使用最新注册。其他注册将被覆盖。在您的情况下,如果插件存在,Autofac将使用插件注册,并注册自己的IFoo服务实现

如果多个组件公开同一服务,Autofac将使用最后注册的组件作为该服务的默认提供程序


参见

如Memoizer所述,最新的注册将覆盖较早的注册。我的结局是这样的:

//收集插件程序集
字符串applicationPath=Path.GetDirectoryName(
Assembly.GetEntryAssembly().Location);
字符串pluginsPath=Path.Combine(applicationPath,“plugins”);
程序集[]插件程序集=
目录.enumerate文件(pluginpath,*.dll)
.Select(路径=>Assembly.LoadFile(路径))
.ToArray();
//寄存器类型
var builder=new ContainerBuilder();
Register(context=>newdefaultfoo());
builder.RegisterAssemblyTypes(插件程序集)
.Where(type=>type.IsAssignableTo())
.As();
//测试选择了哪个IFoo实现
var container=builder.Build();
IFoo foo=container.Resolve();
WriteLine(foo.GetType().FullName);

这是Autofac的预期行为,还是巧合?你有任何参考资料吗?这表明它是预期的:注意,其他注册不被覆盖!Autofac将只使用最后注册的组件,但之前的组件仍然可以解析(例如解析)。这对于测试非常有用,因为它允许使用其测试对应项覆盖默认注册。