質問
次の登録が必要です
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は、他のアダプターとともに、すぐに使用できるコレクションをサポートしています。追加の機能でコンポーネントをラップできます。
これは、2.x以前のImplicitCollectionSupportModuleと同じ使用方法ですが、すぐに使用できます。
古いバージョンの場合(0.X-1.4)
2つの方法:
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>>();
その後:
builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.Register(component1).As<ILogger>;
builder.Register(component2).As<ILogger>;
IEnumerableを提供します。
または 2)ImplicitCollectionSupportモジュールを使用できます。これにより、Autofacの新しいバージョンのようにコードが機能します。
<*>すべてを解決するのではなく、ILoggerのコレクションを解決します。
<*>再びIEnumerableを提供します。
他のヒント
新しい(2.x)バージョンのための更新。必要なのは次のとおりです。
container.Resolve<IEnumerable<I>>();
RegisterCollection()
やImplicitCollectionSupportModule
は不要になりました-この機能はすぐに使用できます。