c# – Autofac:解析同名的IEnumerable注册

我正在使用Autofac来处理我的应用程序中的依赖注入.为了不必显式地进行每一次注册,我首先使用RegisterAssemblyTypes().AsImplementedInterfaces()然后只处理需要特殊配置的那些.

我有一个名为IToolStripPopulator的接口,它有几个不同的实现,其中有几个正在使用,但有些不再存在(因为我正在努力工作并遵守OCP,如果我需要不同,我通常不会更改它们功能,而是让他们独自一人,创造新的,做我现在需要的东西).出于这个原因,我需要以两种方式覆盖接口的自动注册:

>一个实现将被注入到我的主逻辑中,并充当其他一些实例的装饰器.我自然希望通过As< IToolStripPopulator>()注册它,并完成它,因为这是我的应用程序的功能目前依赖的实现.
>那些其他实现是仅在该装饰器类中使用的“内部”填充器.注入它们有两种方法:

>使用特定类型明确地将外部实现的构造函数连接起来;这不是很好,也因为该构造函数必须采用我现在使用的内部填充程序的确切数量,这不符合OCP.
>让外部实现采用IEnumerable< IToolStripPopulator&gt ;;这就是我想做的事情,但它也是我被困的地方. 我不能让Autofac自己解决IEnumerable,因为它只会解析接口的所有实现,甚至那些我不再使用的实现以及我不想要的那个“外部”(和在解决期间可能会导致无限循环). 所以我想做的是:

// the inner populators
builder.RegisterType<BrowsersMenuPopulator>().Named<IToolStripPopulator>("inner");
builder.RegisterType<ThreadsafeConnectionMenuPopulator>().Named<IToolStripPopulator>("inner");

// the decorator implementation
builder.RegisterType<BrowserAndConnectionMenuPopulator>().As<IToolStripPopulator>().WithParameter( ? );

但是,此时无法实际访问现有注册.

解决方法:

….在这里,我只尝试了一件我实际上并没有想要工作的东西,但确实如此.

builder.Register(c => c.ResolveNamed<IEnumerable<IToolStripPopulator>>("inner")).As<IEnumerable<IToolStripPopulator>>();

不像我预期的那样,尝试解析IEnumerable< IToolStripPopulator>注册名为“inner”,但是一个名为“inner”的IEnomrable IToolStripPopulator注册 – 正如我所需要的那样.

然后,这将正确解析并注入到装饰器实现中,只需注册As< IToolStripPopulator>()而无需进一步配置.

从形式方面来说,我实际上更愿意能够通过装饰器注册来直接解析名称,因为这将更加直观和灵活(如果我需要解决几个IEnumerable< IToolStripPopulator>?),但在许多方面这种情况应该足够了.

@ codinghorror的“橡皮鸭问题解决”的概念规则我每个工作日….

上一篇:c# – 解决条件依赖关系autofac


下一篇:ASP.NETCore使用AutoFac依赖注入