55


5

以下の登録を考える

builder.Register()。As(); builder.Register()。As(); builder.Register()。As();

var container = builder.Build();

私はタイプIのすべてのインスタンスを `IEnumerable`として解決しようとしています(配列またはコレクションは関係ありません)。

ウィンザーでは、私は次のように書いていたでしょう。

foreach(私はcontainer.ResolveAll()にいます){... }

WindsorからAutofac 1.4.4.561に移行しようとしていますが、同等の構文が表示されません。

2 Answer


77


  • Autofacの現在のバージョンでは、(2.0なので、あなたが今日使うべきものは何でも)

あなたは複数の `ILoggers`を登録します(例えば):

var builder = new ContainerBuilder();

builder.Register().As();

builder.Register().As().PreserveExistingDefaults(); //コンソールロガーをデフォルトにします

それからすべての `ILogger`を手に入れます:

var loggers = container.Resolve>();

特別なことをする必要はありません。希望するタイプの `IEnumerable`を要求するだけです。 Autofacは追加機能なしであなたのコンポーネントを包むことができる他の adaptersと共に箱から出してすぐにコレクションをサポートします。

これは、2.xより前のImplicitCollectionSupportModuleと同じ使用法ですが、焼き付けられています。

旧バージョン用(0.X - 1.4)

二通り:

1)コレクション登録を利用する

var builder = new ContainerBuilder(); builder.RegisterCollection().As>();

builder.Register().As().MemberOf>();

builder.Register().As().MemberOf>();

その後:

var loggers = container.Resolve>();

これはあなたにIEnumerableを与える。

または2)ImplicitCollectionSupportモジュールを使用すると、コードが新しいバージョンのAutofacのように機能します。

builder.RegisterModule(new ImplicitCollectionSupportModule()); builder.Register(component1).As; builder.Register(component2).As;

次に、すべてを解決するのではなく、ILoggerのコレクションを解決します。

var loggers = container.Resolve>();

これもIEnumerableを与えます。


54


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

container.Resolve>();

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