ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-06-13 12:01:43  阅读:199  来源: 互联网

标签:c dependency-injection inversion-of-control ioc-container autofac


我正在使用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,dependency-injection,inversion-of-control,ioc-container,autofac
来源: https://codeday.me/bug/20190613/1232892.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有