ドキュメントの例では、呼び出しているのと同じオブジェクトに存在する計算機フィールドが入力されています
_container.ComposeParts(this);
しかし、私はそのComposeParts()
方法について少し混乱しています。値をインポートするすべてのオブジェクトのコンストラクターで呼び出すことになっているものではないと推測しているので、オブジェクトがインスタンス化されたときにMEFがオブジェクトのフィールドに入力する正しい方法は何ですか?
ドキュメントの例では、呼び出しているのと同じオブジェクトに存在する計算機フィールドが入力されています
_container.ComposeParts(this);
しかし、私はそのComposeParts()
方法について少し混乱しています。値をインポートするすべてのオブジェクトのコンストラクターで呼び出すことになっているものではないと推測しているので、オブジェクトがインスタンス化されたときにMEFがオブジェクトのフィールドに入力する正しい方法は何ですか?
いいえ、すべてのコンストラクターでComposePart()を呼び出す必要はありません。構成MEF中(実行時)、すべてのカタログを調べて、インポートと有効なエクスポートを一致させようとします。これは間違いなく落とし穴の1つです。つまり、MEFにオブジェクトをインスタンス化させる必要があります。自分で行うのではなく、(またはWPF / Silverlightにそれを行うように指示します)。それはあなたのプロジェクトとクラスを通してカスケードし、すべてを接続します。
インポートを行うクラスがあるが、それらのインスタンスを動的に作成する必要がある場合は、コンストラクターで次のようなものを使用できます-CompositionInitializer.SatisfyImports()など。
ただし、これを行う場合は、Unityなどの別のコンテナーを調べることをお勧めします。
アプリでDIを実現するためにMEFを使用している場合は、次の点に注意してください。コンポジションは、コンポジションルートでのみ(できれば)発生する必要があります(Mark Seemannの記事を参照してください:http://blog.ploeh.dk/2011/07 / 28 / CompositionRoot /)。
IoCコンテナーを使用して、実行時に後の時点で目的のインスタンスを明示的に解決しようとする試みは、サービスロケーターの実践であり、DIの世界ではアンチパターンと見なされています。