PreserveExistingDefaults的使用?

时间:2015-04-27 09:23:06

标签: .net dependency-injection autofac

为什么以及何时应该在autofac注册期间使用PreserveExistingDefaults?

我已经阅读了它使用Autoface docs的表单: http://docs.autofac.org/en/latest/register/registration.html

但我的问题是,在什么情况下我们会用单一界面注册多个实现。

任何人都可以实时提供一些例子。

1 个答案:

答案 0 :(得分:2)

当您想要注册新实现而不更改默认实现时,可以使用它。当您为单个界面注册多个注册时,当您尝试注册IEnumerable<IService>

时, Autofac 将解析所有这些注册

假设您有IService

的2个实现
interface IService { }
class Service1 : IService { }
class Service2 : IService { }

如果你这样注册:

ContainerBuilder builder = new ContainerBuilder();
builder.RegisterType<Service1>().As<IService>();
builder.RegisterType<Service2>().As<IService>().PreserveExistingDefaults();

IContainer container = builder.Build();

IService service = container.Resolve<IService>();  // will be Service1

List<IService> services = container.Resolve<IEnumerable<IService>>().ToList();
services[0]; // => Service1 
services[1]; // => Service2 or the opposite, there is no warranty on the order

解决Service1后,您将获得IService,但解决IEnumerable<IService>时将解决这两个问题

顺便说一下,使用它真的很特别。我不记得曾经用过它。使用Named and Keyed services

总是更简单