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>
。希望のタイプのものを要求するだけです。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を提供します。