アプリケーションで依存性注入を処理するために Autofac を使用しています。すべての登録を明示的に行う必要がないように、最初に使用RegisterAssemblyTypes().AsImplementedInterfaces()
してから、特別に構成する必要があるものだけを処理します。
いくつかの異なる実装を持つという名前のインターフェイスがIToolStripPopulator
あり、そのうちのいくつかは使用されていますが、一部はもう使用されていません (私はしっかりと動作し、OCP に準拠しようとしているため、通常、別の機能が必要な場合はそれらを変更しません) 、むしろそれらをそのままにして、今必要なことを行う新しいものを作成します)。そのため、次の 2 つの方法でインターフェイスの自動登録を上書きする必要があります。
- 1 つの実装はメイン ロジックに挿入され、他のいくつかの実装のデコレータとして機能します。
As<IToolStripPopulator>()
これは、アプリケーションの機能が現在依存している実装であるため、当然、これを介して登録し、それを使用して実行したいと考えています。 - これらの他の実装は、そのデコレータ クラス内でのみ使用される「内部」ポピュレータです。それらを注入するには、次の 2 つの方法があります。
- 特定の型を使用して外部実装のコンストラクターを明示的に接続します。また、そのコンストラクターは、私が現在使用している正確な数の内部ポピュレーターを取得する必要があり、OCP に準拠していないため、これはあまり良くありません。
- 外側の実装に
IEnumerable<IToolStripPopulator>
;を取らせます。これは私がやりたいことですが、行き詰まっているところでもあります。
AutofacIEnumerable
だけでそれを解決することはできません。インターフェイスのすべての実装を解決してしまうからです。解決中に無限ループが発生する可能性があります)。
だから私がやりたいことはこれです:
// the inner populators
builder.RegisterType<BrowsersMenuPopulator>().Named<IToolStripPopulator>("inner");
builder.RegisterType<ThreadsafeConnectionMenuPopulator>().Named<IToolStripPopulator>("inner");
// the decorator implementation
builder.RegisterType<BrowserAndConnectionMenuPopulator>().As<IToolStripPopulator>().WithParameter( ? );
しかし、その時点で既存の登録に実際にアクセスする方法はありません。