4

私は複数のコンテキストで問題を抱えています。主な解決策は、リポジトリ間でコンテキストを共有することですが、これを行う方法の良い例は見つかりませんでした。Entity Framework 4.1コードファースト - リポジトリ間でdbContextを共有する適切な方法は?

参考までに、MVC Web Appを使用してデータレイヤーに接続しています。私はユーザーの要求ごとに1つのコンテキストを持っていたいと思います(これが正しいと仮定して)。

おかげで、

編集 -

これはBrokenGlassのリンクと、次のSO Questionの助けを借りて、私のソリューションです:

私は基本的に作業パターンと依存性注入の単位を実装しました。 MVCの使用に加えて、Ninjectも使用しています。指定したリポジトリのコンストラクタで

(作業単位パターンの詳細については、以下のリンクを参照):

public class PersonRepository : IPersonRepository 
{ 
    private readonly MyContext _context; 

    public PersonRepository(IUnitOfWork unitOfWork) 
    { 
     if (unitOfWork == null) 
      throw new ArgumentNullException("unitOfWork"); 

     _context = unitOfWork as MyContext; 
    } 

    //... 
} 

私のMVCアプリでNinjectMVC3クラスの(キーがInRequestScope()メソッドである):

private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<IUnitOfWork>().To<MyContext>().InRequestScope(); 
    kernel.Bind<IPersonRepository>().To<PersonRepository>(); 
    //... 
} 

答えて

4

リポジトリレイヤでは、1つの要求を表すunit of workが提供され、要求を満たすために必要なすべての個々のリポジトリで使用されるコンテキストオブジェクトが使用されます。

HTTP/webアプリケーションの場合、具体的には、各HTTPリクエストの共有データを格納するHttpContext.Current.Itemsにdbコンテキストをキャッシュすることができます。 attaching linq to sql datacontext to httpcontext in business layer

+0

Unit of Workリンクのおかげで、私は自分のリポジトリにDIのタイプを実装していなかったので、本質的にそれは私がする必要がありました。私もNinjectを使用しているので、答えが少し複雑になりましたが、解決が簡単になりました。私は私の最終的な解決策で私の質問を更新します。 – matto0

0

C#/EF and the Repository Pattern: Where to put the ObjectContext in a solution with multiple repositories?に対する私の答えはObjectContextの単一のインスタンスで動作RepositoryProviderの実装を提供します。また、SO詳細については、スレッド、この同様のをチェックしてください。同様の方法でコードを使用することもできますが、EF ObjectContextの代わりにLINQ-to-SQL DataContextを使用します。特定のDIフレームワークにバインドされていないRepositoryProviderの実装は、どのDIフレームワークでも構成できます。

また、あなたはhereからDataContextFactoryクラスを使用して、スレッドまたは(例えばHttpContext.Current.Itemsと@ BrokenGlassの答えのように)WebRequestクラスのいずれかに作成し、DataContextのスコープを管理することができます。

関連する問題