对于当前的Autofac版本:( 2.0+,因此您今天应该使用的任何东西)
您注册多个ILoggers
(例如):
var builder = new ContainerBuilder();
builder.Register<ConsoleLogger>()
.As<ILogger>();
builder.Register<EmailLogger>()
.As<ILogger>()
.PreserveExistingDefaults();
然后得到所有ILogger
s:
var loggers = container.Resolve<IEnumerable<ILogger>>();
您不需要做任何特别的事情,只需索要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>>();
然后:
var loggers = container.Resolve<IEnumerable<ILogger>>();
这给你一个IEnumerable。
或2)您可以使用ImplicitCollectionSupport模块,这将使代码像Autofac的较新版本一样工作:
builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.Register(component1).As<ILogger>;
builder.Register(component2).As<ILogger>;
然后解决ILogger的集合,而不是寻找全部解决方案。
var loggers = container.Resolve<IEnumerable<ILogger>>();
再次为您提供IEnumerable。