鉴于以下注册
builder.Register<A>().As<I>();
builder.Register<B>().As<I>();
builder.Register<C>().As<I>();
var container = builder.Build();
Run Code Online (Sandbox Code Playgroud)
我希望将类型I的所有实例解析为IEnumerable(数组或集合无关紧要).
在温莎,我会写下面的内容.
foreach(I i in container.ResolveAll<I>())
{
...
}
Run Code Online (Sandbox Code Playgroud)
我正在从Windsor迁移到Autofac 1.4.4.561,但看不到相同的语法.
Phi*_*eck 83
对于Autofac的当前版本:(2.0+,所以你今天应该使用的任何东西)
你注册多个ILoggers(例如):
var builder = new ContainerBuilder();
builder.Register<ConsoleLogger>()
.As<ILogger>();
builder.Register<EmailLogger>()
.As<ILogger>()
.PreserveExistingDefaults(); //keeps console logger as the default
Run Code Online (Sandbox Code Playgroud)
然后得到所有ILoggers:
var loggers = container.Resolve<IEnumerable<ILogger>>();
Run Code Online (Sandbox Code Playgroud)
您不需要做任何特殊的事情,只需要一个IEnumerable<T>所需的类型.Autofac具有开箱即用的集合支持,以及可以使用其他功能封装组件的其他适配器.
这与2.x之前的ImplicitCollectionSupportModule的用法相同,但正好在其中出现.
旧版本(0.X - 1.4)
两种方式:
1)使用收集注册
var builder = new ContainerBuilder();
builder.RegisterCollection<ILogger>()
.As<IEnumerable<ILogger>>();
builder.Register<ConsoleLogger>()
.As<ILogger>()
.MemberOf<IEnumerable<ILogger>>();
builder.Register<EmailLogger>()
.As<ILogger>()
.MemberOf<IEnumerable<ILogger>>();
Run Code Online (Sandbox Code Playgroud)
然后:
var loggers = container.Resolve<IEnumerable<ILogger>>();
Run Code Online (Sandbox Code Playgroud)
它给你一个IEnumerable.
或2)您可以使用ImplicitCollectionSupport模块,这将使代码像新版本的Autofac一样工作:
builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.Register(component1).As<ILogger>;
builder.Register(component2).As<ILogger>;
Run Code Online (Sandbox Code Playgroud)
然后解决ILogger的集合,而不是寻找解决所有问题.
var loggers = container.Resolve<IEnumerable<ILogger>>();
Run Code Online (Sandbox Code Playgroud)
这再次给你一个IEnumerable.
Nic*_*rdt 57
针对新(2.x)版本的更新.你现在需要的只是:
container.Resolve<IEnumerable<I>>();
Run Code Online (Sandbox Code Playgroud)
不再需要RegisterCollection()或ImplicitCollectionSupportModule- 这个功能开箱即用.
| 归档时间: |
|
| 查看次数: |
28278 次 |
| 最近记录: |