72

以下の登録を前提としています

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

4

2 に答える 2

96

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を提供します。

于 2009-09-10T16:03:39.457 に答える
60

新しい(2.x)バージョンのためのアップデート。今必要なのは:

container.Resolve<IEnumerable<I>>();

RegisterCollection()またはの必要はもうありませんImplicitCollectionSupportModule-この機能はすぐに使用できます。

于 2010-08-26T11:55:37.523 に答える