5

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

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 的隐式调用吗?

有没有办法指示 Autofac 注册顺序很重要?

4

1 回答 1

4

除非您使用PreserveExistingDefaults(). 快速查看实现表明,注册存储为一个链接列表,其中默认行为添加到开头并PreserveExistingDefaults()添加到末尾。解决单个服务将使您获得列表中的第一项。解决 enumerable 可以让您获得该订单。我不确定这种行为是否保证永远不会改变。

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

于 2012-12-21T19:37:53.847 回答