【发布时间】:2018-05-09 08:48:45
【问题描述】:
在autofac中解析IEnumerable时是否可以过滤依赖关系?
我有多个接口实现(在下面的示例中为IHandler),这些实现是在独立项目中使用 Autofac 模块定义和注册的。我希望能够在父类型中解析时过滤实现(在下面的示例中为Processor)。
IHandler 实现可以注入Processor 并在ctor 中过滤,但这需要解析所有实现,无论是否需要它们,这是浪费。
public interface IHandler { }
public class Handler1 : IHandler { }
public class Handler2 : IHandler { }
public class Handler3 : IHandler { }
public class Processor {
public IEnumerable<IHandler> Handlers;
public Processor(IEnumerable<IHandler> handlers) {
Handlers = handlers;
}
}
static void Main(string[] args)
{
var builder = new ContainerBuilder();
builder.RegisterType<Handler1>().As<IHandler>();
builder.RegisterType<Handler2>().As<IHandler>();
builder.RegisterType<Handler3>().As<IHandler>();
builder.RegisterType<Processor>().AsSelf();
var container = builder.Build();
var processor = container.Resolve<Processor>();
}
由于一次只能解析 1 个密钥,因此我使用密钥的尝试无效:
[Flags]
public enum HandlerType
{
One = 1,
Two = 2,
Three = 4
}
builder.RegisterType<Handler1>().Keyed<IHandler>(HandlerType.One);
builder.RegisterType<Handler2>().Keyed<IHandler>(HandlerType.Two);
builder.RegisterType<Handler3>().Keyed<IHandler>(HandlerType.Three);
var enabledHandlers = HandlerType.One | HandlerType.Three;
builder.RegisterType<Processor>().AsSelf()
.WithParameter(ResolvedParameter.ForKeyed<IEnumerable<IHandler>>(enabledHandlers));
【问题讨论】:
-
您希望根据哪些条件过滤这些处理程序?
-
感谢@UmutOzel,我也许可以使用
ResolvedParameter使其工作。 -
@Steven 我应该从配置文件中说得更清楚,例如
<add key="Handlers" value="1,3" />...
标签: c# .net dependency-injection autofac