PreserveExistingDefaults 的用途?
Uses of PreserveExistingDefaults?
我们为什么以及何时应该在 autofac 注册期间使用 PreserveExistingDefaults?
我已经阅读了它在 Autoface 文档中的用法:
http://docs.autofac.org/en/latest/register/registration.html
但我的问题是,什么时候我们会用单一接口注册多个实现。
谁能给出一些实时的例子。
当您想注册一个新的实现而不更改默认实现时,可以使用它。当您为单个接口注册多个注册时,Autofac 将在您尝试注册 IEnumerable<IService>
时解析所有这些注册
假设您有 2 个 IService
的实现
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
当你解决IService
时,你将获得Service1
,但当你解决IEnumerable<IService>
时,你将同时解决这两个问题
顺便说一句,用起来真的很特别。我不记得曾经用过它。使用 Named and Keyed services
总是更简单
我们为什么以及何时应该在 autofac 注册期间使用 PreserveExistingDefaults?
我已经阅读了它在 Autoface 文档中的用法: http://docs.autofac.org/en/latest/register/registration.html
但我的问题是,什么时候我们会用单一接口注册多个实现。
谁能给出一些实时的例子。
当您想注册一个新的实现而不更改默认实现时,可以使用它。当您为单个接口注册多个注册时,Autofac 将在您尝试注册 IEnumerable<IService>
假设您有 2 个 IService
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
当你解决IService
时,你将获得Service1
,但当你解决IEnumerable<IService>
顺便说一句,用起来真的很特别。我不记得曾经用过它。使用 Named and Keyed services
总是更简单