1

初めて質問します、長年の読者です。

オブジェクトのインスタンス化を処理するために、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 文字列を更新するだけで機能します。

4

1 に答える 1

1

マルチテナント MVC Azure ベースのアプリケーションでも同様の状況に直面し、データベース操作を要求しているユーザーのアクティブなセッションから現在の接続文字列を取得するメソッドをエクスポートすることで解決しました

MVC セッションの詳細からメソッド抽象 DbContext をエクスポートすると、エクスポートされたメソッドを DbContext または IRepository 実装にインポートするだけです。

プロパティのエクスポートを使用しないでください。プロパティがエクスポートされると、その値は MEF によって保存され、アクティブなセッションに保存されている現在の値は取得されません。メソッドのエクスポートにより、アクティブなセッションに保存されている接続文字列の現在の値を取得できます。

さらに明確にする必要がある場合はお知らせください。

于 2013-10-13T19:14:45.203 に答える