Tea*_*Dev 4 c# dependency-injection ioc-container inversion-of-control autofac
我正在使用Autofac来处理我的应用程序中的依赖注入.为了不必明确地进行每一次注册,我首先使用RegisterAssemblyTypes().AsImplementedInterfaces()然后只处理那些需要特殊配置的注册.
我有一个名为的接口IToolStripPopulator有几个不同的实现,其中一些正在使用,但有些不再使用(因为我正在努力工作并遵守OCP,如果我需要不同的功能,我通常不会更改它们,而是让他们独自一人,创造新的,做我现在需要的东西).出于这个原因,我需要以两种方式覆盖接口的自动注册:
As<IToolStripPopulator>()它来注册并完成它,因为这是我的应用程序的功能目前依赖的实现.IEnumerable<IToolStripPopulator>; 这就是我想做的事情,但它也是我被困的地方.我不能让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( ? );
Run Code Online (Sandbox Code Playgroud)
但是,此时无法实际访问现有注册.
....在这里,我只尝试了一件我实际上并没有想要工作的东西,但确实如此.
builder.Register(c => c.ResolveNamed<IEnumerable<IToolStripPopulator>>("inner")).As<IEnumerable<IToolStripPopulator>>();
Run Code Online (Sandbox Code Playgroud)
不像我预期的那样,尝试解决IEnumerable<IToolStripPopulator>名为"inner" IEnumerable的IToolStripPopulator注册,但是注册名为"inner" - 正如我需要的那样.
然后,这将被正确地解析并注入到装饰器实现中,只需注册As<IToolStripPopulator>()而无需进一步配置.
从形式方面我真的宁愿能写明该名直接与装饰注册来解决,因为这将是更加直观和灵活的(如果我需要解决一些什么IEnumerable<IToolStripPopulator>?),但在许多情况下,这应该是足够.
@ codinghorror的"橡皮鸭问题解决"的概念规则我每个工作日....
| 归档时间: |
|
| 查看次数: |
1691 次 |
| 最近记录: |