私はアプリケーションをリファクタリングして依存性注入 (コンストラクター注入による) を含めるようにしていますが、トリッキーなコーナーケースに遭遇しました:
現在、インスタンス化されたときに(抽象基本クラス) インスタンスImageViewer
のアセンブリを検索し、リフレクションを使用してそれらをインスタンス化するオブジェクトがあります。ImageViewerPlugin
これは、ImageViewer
次のようなメソッド (すべての具体的なプラグイン タイプのループで呼び出される) を使用するコンストラクターで行われます。
private ImageViewerPlugin LoadPlugin(Type concretePluginType)
{
var pluginConstructor = concretePluginType.GetConstructor(
BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public,
null,
new[] { typeof(ImageViewer) },
null);
return (ImageViewerPlugin) pluginConstructor.Invoke(
new object[] { constructorParameter });
}
ImageViewerPlugin クラスは、おおよそ次のようになります。
internal ImageViewerPlugin
{
protected ImageViewer _viewer;
protected ImageViewerPlugin(ImageViewer viewer)
{
_viewer = viewer;
}
}
具体的な実装は、おおよそ次のようになります。
internal AnImageViewerPlugin
{
public AnImageViewerPlugin(ImageViewer viewer) : base(viewer)
{
}
}
各ImageViewer
インスタンスには、独自のImageViewerPlugin
インスタンスのコレクションがあります。
アプリケーションが DI コンテナーとコンストラクター インジェクションを使用するようにリファクタリングされたので、これらのプラグインには、DI コンテナーによって解決する必要がある依存関係 (以前はグローバル静的クラスの使用によって隠されていました) があることがわかりましたが、私はService Locator (アンチパターン) を使用せずにそれを行う方法がわからない。
最も賢明な解決策は、DI を使用してこれらのプラグイン インスタンスを作成することです。これにより、追加のコンストラクター パラメーターを追加して、依存関係をコンストラクター インジェクションを介して注入することができます。viewer
しかし、それを行う場合、残りのパラメーター値を注入しながら特定のパラメーター値を渡すにはどうすればよいでしょうか?
ImageViewerPluginFactory
これを達成するのに役立つと思いましたが、各プラグインが異なるコンストラクター署名を持つ可能性が高いため、そのようなファクトリを実装する方法がわかりません。
このシナリオをどのように解決できますか? それとも、これに完全に間違った方法でアプローチしていますか?