以下の登録が与えられた場合
builder.Register<A>().As<I>();
builder.Register<B>().As<I>();
builder.Register<C>().As<I>();
var container = builder.Build();
タイプIのすべてのインスタンスを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
sを取得します。
var loggers = container.Resolve<IEnumerable<ILogger>>();
特別なことをする必要はありません。IEnumerable<T>
希望するタイプ。 Autofacは、追加機能でコンポーネントをラップできる他の adapters とともに、すぐに使用できるコレクションをサポートしています。
これは、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が得られます。
新しい(2.x)バージョンのための更新。あなたが今必要なのは:
_container.Resolve<IEnumerable<I>>();
_
RegisterCollection()
やImplicitCollectionSupportModule
は不要になりました-この機能はすぐに使用できます。