質問

次の登録が必要です

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は不要になりました-この機能はすぐに使用できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top