2012-01-02 6 views
4

DbContextCoreContextという名前)のコアプロジェクトを持つソリューションで作業しています。このコンテキストには、一般的な製品に共通の検証規則を提供する抽象クラス(ProductConstraints)を参照するエンティティ(Product)が含まれています。この文脈は決して直接使用されない。 CoreContext(ProductXContextとして)とProductConstraints(ProductXConstraints)の両方のクラスを継承する同じソリューションに、特定の製品のカスタム検証ルールを実装する3つのプロジェクト(Product1、Product2、Product3)が3つあります。Code Firstの複数のコンテキスト(同じベースの)を動的に切り替える方法

また、カスタムCodeFirstMembershipを含む別のプロジェクトもあります。 'User'エンティティには、ユーザーが操作する製品を定義する 'Product'プロパティが含まれています。

最後に、現在のユーザーの「製品」情報に基づいて適切なコンテキストをインスタンス化するMVC3プロジェクトがあります。この製品を受け取ったContextFactoryのようなものを作成し、正しいDbContextを返します。私はいくつかのアプローチを試みましたが、大きな成功はありませんでした。

+0

でコンストラクタ・インジェクションを使用できますか?何が失敗した? –

+0

私は反射を使ってみましたが、いくつかの依存関係の問題がありました。 –

答えて

3

依存性注入を使用すると、問題を解決できます。ユーザーが1つの製品のみにバインドされている場合、その詳細をSessionに保存して、データベースへのラウンドトリップを回避できます。

public class ContextFactory 
{  
    public CoreContext CreateContext() 
    { 
     var product = HttpContext.Current.Session["Product"] as string; 

     //resolve the correct context 

     return context; 
    } 
} 

DI容器に工場を登録することができます。

builder.Register(c => ContextFactory.CreateContext()).As<CoreContext>(); 

次に、あなたがしようとしました近づくあなたのコントローラ

public class MyController : Controller 
{ 
    public MyController(CoreContext context) 
    { 

    }  
} 
+0

ユーザーは多くの製品で作業できますが、一度に1つで、セッション変数のアプローチが有効です。 私はDIコンセプトを認識していますが、以前はDIコンテナを使用していませんでした。私はMSUnityに試してみましょう。 –

+0

最後にプロジェクトに戻り、コンテナを使用してファクトリを作成しました。すべてが今働いています。しかし、私のMVCプロジェクトはまだ私の3つの製品コンテキストを参照しています...私はこれらの参照を削除し、実際にそれらをUnityを使用して注入しようとします。私はあなたの答えを答えとしてマークしています、ありがとう! –

関連する問題