Autofac 能否按照注册顺序返回某个类型的所有服务?

ven*_*aur 5 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();
Run Code Online (Sandbox Code Playgroud)

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

有没有办法告诉 Autofac 注册顺序很重要?

Jim*_*lla 4

Autofac 注册始终是“最后注册获胜”,除非您使用PreserveExistingDefaults(). 快速浏览一下实现就会发现,注册被存储为一个链接列表,其中默认行为添加到开头并PreserveExistingDefaults()添加到结尾。解决单个服务即可获得列表中的第一项。解析可枚举即可获得该订单。我不确定这种行为是否保证永远不会改变。

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