Autofac:解决Type的所有实例
鉴于以下注册
builder.Register<A>().As<I>(); builder.Register<B>().As<I>(); builder.Register<C>().As<I>(); var container = builder.Build();  我正在寻找解决typesI的所有实例作为IEnumerable (数组或集合,这并不重要)。 
在温莎,我会写下以下内容。
 foreach(I i in container.ResolveAll<I>()) { ... } 
我正在从Windsor迁移到Autofac 1.4.4.561,但看不到相应的语法。
对于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 
 然后得到所有的ILogger的: 
 var loggers = container.Resolve<IEnumerable<ILogger>>(); 
 你不需要做任何特殊的事情,只需要一个IEnumerable<T>所需的types。  Autofac具有开箱即用的集合支持,以及其他适配器 ,可以用附加function包装您的组件。 
这与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>>(); 
然后:
 var loggers = container.Resolve<IEnumerable<ILogger>>(); 
它给你一个IEnumerable。
或2)您可以使用ImplicitCollectionSupport模块,这将使代码工作像新版本的Autofac:
 builder.RegisterModule(new ImplicitCollectionSupportModule()); builder.Register(component1).As<ILogger>; builder.Register(component2).As<ILogger>; 
然后parsing一个ILogger的集合,而不是寻求解决所有的问题。
 var loggers = container.Resolve<IEnumerable<ILogger>>(); 
这给你一个IEnumerable,再次。
新的(2.x)版本的更新。 你现在需要的是:
 container.Resolve<IEnumerable<I>>(); 
  RegisterCollection()或ImplicitCollectionSupportModule不再需要了 – 这个function是开箱即用的。