私は現在 Autofac を使用していますが、他の IOC コンテナーに関するコメントも受け付けています。可能であれば、Autofac を使用したソリューションを希望します。また、私は IOC に少し慣れていないため、IOC コンテナを何に使用すべきかをひどく誤解している可能性があります。
基本的には以下のような状況です。
アプリの最上位の IOC コンテナーがあります。子コンテナー/スコープのツリーがあり、同じ「サービス」(IWhatever) を解決するツリーのレベルに応じて異なる方法で解決したいと考えています。さらに、ツリーのあるレベルでサービスが登録されていない場合は、適切な実装が見つかるまでツリーを上方向に横断したいと考えています。
さらに、特定のコンポーネントを作成するときに、親コンテナー/スコープへのアクセスが必要になる可能性は十分にあります。多くの場合、登録しているコンポーネントは、親スコープ内の同じサービスまたは別のサービスに依存します。
この依存関係を Autofac で表現する方法はありますか? 何かのようなもの:
builder.Register(c=>
{
var parentComponent = ?.Resolve<ISomeService>();
var childComponent = new ConcreteService(parentComponent, args...);
return childComponent;
}).As<ISomeService>();
いくつかの理由で、上記の疑似コードに似たものを動作させることができません。
A) スコープ ツリーのすべてのレベルが共通の登録セットを共有しているようです。特定の「スコープ」に限定された特定の登録を行う方法を見つけることができないようです。
B) 特定のスコープの親スコープを取得する方法が見つからないようです。コンテナー内の ILifetimeScope を解決し、それを親スコープを提供する具体的な LifetimeScope インスタンスにケース化することはできますが、おそらくこの方法で使用することを意図したものではないと推測しています。これは安全ですか?
C) どのコンテナが解決されたオブジェクトを所有しているかを Autofac に伝える方法がわかりません。多くのコンポーネントについて、コンポーネントが構築されるスコープによって「所有」されることを望みます。ここでタグ付けされたコンテキストが役に立ちますか? ツリーのすべてのレベルに一意のタグを付ける必要がありますか? ツリーの深さは実行時に決定されるため、これは困難です。
非常に長い質問で申し訳ありません。要約すれば:
1) Autofac を使用してやりたいことを行う方法はありますか?
2) この種の依存構造により適した別のコンテナーはありますか?
3) IOC は、この点で完全に間違ったツールですか?