web-dev-qa-db-ja.com

Autofac:タイプのすべてのインスタンスを解決します

以下の登録が与えられた場合

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に移行していますが、同等の構文が表示されません。

61
crowleym

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

次に、すべてのILoggersを取得します。

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が得られます。

81
Philip Rieck

新しい(2.x)バージョンのための更新。あなたが今必要なのは:

_container.Resolve<IEnumerable<I>>();
_

RegisterCollection()ImplicitCollectionSupportModuleは不要になりました-この機能はすぐに使用できます。

56