0

* IOC コンテナー (Autofac ですが、何でもかまいません) を使用するアプリケーションがあります。

外部で開発されたモジュールもあります。各モジュールは、そのモジュールに固有のリポジ​​トリ、サービスを定義して、DI コンテナーの独自のセットアップを指定する必要があります。

展開時に、これらのモジュールは XML 構成を介して手動で Autofac に登録されます。

通常、各モジュールが IOC コンテナーから Type のインスタンスを要求したい場合は、ServiceLocator パターンを使用できます。これにより、Autofac/Unity/StructureMap/etc などの特定の IOC コンテナー タイプから各モジュールが分離されます。

しかし、登録時に各モジュールを IOC コンテナーから分離したいと考えています。たとえば、container.Register().As(); を実行するとき。

すべての IOC コンテナーには、ほぼ同じことを達成するためのさまざまな方法があるため、標準的なパターンがあるかどうか疑問に思っています。

更新:型インスタンスの解決ではなく、型の登録を不可知論化する方法を具体的に探しています。

4

2 に答える 2

5

この種のシナリオが原因で、サービス ロケーター パターンは支持されなくなりました。IOC コンテナーからモジュールを分離することは間違いなく良い考えですが、サービス ロケーター パターンは、何らかの方法でそれを参照する必要があることを意味します。独自の汎用 IOC コンテナー ラッパーを作成することは、誰もが耐えなければならないタスクではありません。

この状況でより一般的に受け入れられているパターンは、モジュールの依存関係を注入し (ほとんどの場合、コンストラクター注入によって)、コードのエントリ ポイントで IOC コンテナーのみを参照することです。その後、モジュールはすべての依存関係が満たされている状態で初期化されます。IOC コンテナーは 1 か所でのみ参照されるため、抽象化する必要はありません。1 つ選択するだけでよく、後で変更する場合は、コード内の 1 つのクラスを変更するだけで済みます。

つまり、モジュールが IOC コンテナーにオブジェクトのインスタンスを要求する場合は常に、モジュールのコンストラクターを介してこのインスタンスを渡します。要求する必要があるオブジェクトにランタイム依存関係がある場合は、代わりにコンストラクターを介してそれらのファクトリを渡します。

詳細については、この記事を参照してください。

Martin Fowlerは、サービス ロケータについてそれほど厳しくない見解を示していますが、結論は同じだと思います。

于 2013-04-16T13:44:48.750 に答える
0

この投稿から長い時間が経ちましたが、まさにそのような目的のために「Agnostic IoC」というプロジェクトを作成しました。このプロジェクトは、あなたが説明した問題を解決するために特別に設計されており、セットアップする機能を提供する不可知的なコア API を使用します。登録を行い、最終的な実装で nuget パッケージを使用して解釈します。

https://github.com/cardinal252/Agnostic-Ioc

http://cardinalcore.co.uk/agnostic-ioc/getting-started/

于 2014-09-27T09:10:14.933 に答える