使用 Autofac 将指定 keyed/named 项的列表注入组件
Use Autofac to inject a list of specified keyed/named items into component
我有一个接口 IService
,我有多个实现。我有一个 class ConsumerClass
以 IEnumerable<IService>
作为参数。我意识到如果我只是离开它,Autofac 将自动创建可枚举并用所有已注册的服务实现填充它,但我想指定注入哪些实现。
这样做的原因是 ConsumerClass
可能有一个实现,但在 Autofac 中注册了两次 - 唯一的区别是注入的内容。
我无意中发现了这一点。基本上,ResolvedParameter 构造函数的第二个参数 returns 结果填充它,因此我可以自己创建列表。它并不完美,但它有效:
builder.RegisterType<Component>().WithParameters(new[] {
new ResolvedParameter((p,c) => p.Name == "serv",(p,c) =>
new List<ITerry>
{
c.ResolveKeyed<IService>(Services.Svc1),
c.ResolveKeyed<IService>(Services.Svc3),
c.ResolveKeyed<IService>(Services.Svc8),
})
});
我有一个接口 IService
,我有多个实现。我有一个 class ConsumerClass
以 IEnumerable<IService>
作为参数。我意识到如果我只是离开它,Autofac 将自动创建可枚举并用所有已注册的服务实现填充它,但我想指定注入哪些实现。
这样做的原因是 ConsumerClass
可能有一个实现,但在 Autofac 中注册了两次 - 唯一的区别是注入的内容。
我无意中发现了这一点。基本上,ResolvedParameter 构造函数的第二个参数 returns 结果填充它,因此我可以自己创建列表。它并不完美,但它有效:
builder.RegisterType<Component>().WithParameters(new[] {
new ResolvedParameter((p,c) => p.Name == "serv",(p,c) =>
new List<ITerry>
{
c.ResolveKeyed<IService>(Services.Svc1),
c.ResolveKeyed<IService>(Services.Svc3),
c.ResolveKeyed<IService>(Services.Svc8),
})
});