IoC コンテナーがどのように機能するかをよりよく理解し、自分で使用するコードを作成したいと考えています。コンテナーのクラスを作成する際のベスト プラクティスはありますか? シングルトンですか?静的ですか?シングルトンではなく、解決されたオブジェクトを保持するための静的プロパティがたくさんあるだけですか?
1 に答える
私が知っている IoC コンテナーは静的でもシングルトンでもなく、作成する正当な理由が見当たりません。通常のクラスにして、そのインスタンスを作成するだけです。いくつかのインスタンスを使用して独立した関心事を分離したいシナリオがあります。
コンポーネントをコンテナにとらわれないようにしたいので、コンテナを参照させないでください。コンポーネント (コンテナーによって解決されるオブジェクト) が新しいインスタンスを取得するためにコンテナーにアクセスできる必要がある場合、通常は、このためのインターフェイスを抽象化します (一般にService Locator Pattern (.NET と呼ばれますが、それはすべて同じ))、コンテナがそれ自体をコンポーネントに注入できるようにします。繰り返しますが、静的クラスまたはメソッドの理由はありません。
このプラクティスに従うべき非常に良い理由の 1 つは、コンポーネントにまったく手を加えることなく、コンテナーの実装を交換できることです。たとえば、「プロフェッショナルな」IoC フレームワークに切り替えることができます。
それとは別に、一般的に静的クラスとメソッドには多くの制限があり、特にシステムが変更され、成長し、複雑になる可能性がある場合には、通常は望ましくありません。2 つ言及すると、静的クラスはインターフェイスを実装できません。したがって、テスト目的でコンテナーをモックすることはできません。コンテナを使用するたびに、コントラクトではなくコンテナ アセンブリへの固定参照が必要です。静的クラスをサブクラス化することはできません。