初めて質問します、長年の読者です。
オブジェクトのインスタンス化を処理するために、MEF と DI を (コンストラクター パラメーター インジェクションを通じて) 多用する新しいアプリケーションがあります。私たちが苦労している領域の 1 つは、EF コンテキストの作成です。EF コンテキストを作成するには、conn 文字列が必要です (たとえば、app.config 内)。しかし、私たちのアプリでは、起動時にユーザーがサーバー/データベースを(ユーザー名/パスワードとともに)提供できるようにしています。問題は、MEF を使用して EF コンテキストをデフォルトの conn 文字列でインスタンス化し、ログイン後に conn 文字列をユーザー指定の値に置き換えて、MEF コンテナーで更新する方法です。
これまでにこれを処理した唯一の方法は、LoginViewModel で IoC.Get タイプの呼び出しを使用して既存のエンティティ オブジェクトをコンテナーから取り出し、その接続文字列に新しい値を設定することです。次に、MEF はこの新しい文字列を使用して先に進み、コンテキストをアプリに注入するときに自動的にコンテキストを作成/破棄します。
懸念されるのは、MEF + DI + コンテナーの使用などの問題の中でも特に、サービス ロケーターの匂いがする (そして、コンポジション ルートの外で発生する) ことです。多くのコメンテーターは、パターンへの盲目的な固執は災害のレシピであると指摘しています. 問題は、これがこのシナリオを処理する適切な方法であるかどうかです。作成された抽象ファクトリを使用し、後でそれを使用してコンテキストを作成する必要がありますか?
アプリのブートストラップ部分でコンテキストが作成され、ログイン時に新しい conn 文字列が提供されたときに既にインスタンス化されている場合に、EF の接続文字列を置き換える方法は? MEF は通常、コンテキストを繰り返し作成/破棄します。新しい conn 文字列を設定するにはどうすればよいでしょうか? 共有ポリシーを使用してコンテキスト パーツを作成し、理論的には 1 つだけであり、決して破棄されないようにするため、conn 文字列を更新するだけで機能します。