Autofac可以按照他们注册的相同顺序返回某类型的所有服务吗?

时间:2012-12-21 15:26:43

标签: dependency-injection ioc-container autofac

我正在为一个开源项目做出贡献,该项目希望为其内部服务支持多个容器。支持容器的要求之一是注册顺序很重要。因此,如果以特定顺序注册接口的多个实现,则在解析这些服务的列表时,应按照它们注册的相同顺序返回实现。

var builder = new ContainerBuilder();
builder.RegisterType<PreferredService>().As<IService>();
builder.RegisterType<AlternativeService>().As<IService>();
builder.RegisterType<AdditionalService>().As<IService>();
...
// Get the first (preferred) implementation of IService.
var possibleServices = container.Resolve<IEnumerable<IService>>();
IService idealServiceImplementation = possibleServices.FirstOrDefault();

我的测试表明,Autofac返回的服务是逆序。总是这样吗?我能相信他们每次都会以相反的顺序解决吗?即使我在不​​同接口的其他注册之后注册了一些后来的服务,这种行为是否会保持一致?我可以截取Resolve for lists的隐式调用吗?

有没有办法指示Autofac注册订单是否重要?

1 个答案:

答案 0 :(得分:3)

除非您使用PreserveExistingDefaults(),否则Autofac注册始终是“最后注册获胜”。快速查看实现显示注册存储为链接列表,默认行为添加到开头,PreserveExistingDefaults()添加到结尾。解析单个服务可以获得列表中的第一个项目。解析可枚举会获得该订单。我不确定这种行为是否可以保证不会改变。

如果是我,我会依赖当前的行为,但是如果行为发生变化,那么写一个自动测试会失败。