質問

Entity Frameworkを使用するアプリケーションのデータレイヤーへの接続(リポジトリクラス)を整理する方法についてジレンマがあります。

どのように書きますか?そしてその理由は?

public class ResearchRepository
{
    public Research GetResearch (int id)
    {
        using (MnijenjeEntities mnijenjeContext = new MnijenjeEntities())
        {
            ObjectQuery<Research> researchs = mnijenjeContext.Research;

            var research = (from r in researchs.Include("SurveyPaper")
                            where r.ResearchID == id
                            select r).First();
            return research;
        }
    } //....

または

public class ResearchRepository
{
    private MnijenjeEntities mnijenjeContext;

    public Research GetResearch(int id)
    {
         mnijenjeContext = new MnijenjeEntities();

         ObjectQuery<Research> researchs = mnijenjeContext.Research;

         var research = (from r in researchs.Include("SurveyPaper")
                         where r.ResearchID == id
                         select r).First();
         return research;
    } //....

違いは、 dataContext オブジェクトの使用方法です。

役に立ちましたか?

解決

私は多かれ少なかれ後者の手法を使用していますが、正確に正しい質問をしているのかどうかはわかりません。本当の質問は、「作業単位は何ですか?」いくつかの基本的な事実を考慮する必要があります:

  • 同じ操作で複数のObjectContextを使用することは、1つの操作で単一のObjectContextを使用するよりもかなり困難です。
  • ObjectContextを長時間保持すると、多くのメモリを消費する可能性があり、その他の望ましくない副作用が発生する可能性があります。
  • ObjectContext自体には、「軽量トランザクション」があります。機能、つまり、変更を蓄積し、それらを一度に適用できること、およびある程度、他のコンテキストの変更から隔離されていること。

したがって、私は作業単位ごとに1つのObjectContextを使用し、作業単位が完了するとコンテキストを破棄しようとする傾向があります。作業単位には複数のリポジトリが含まれる可能性があるため、ObjectContextを作成するServiceクラスをインスタンス化してリポジトリを返すこともできます。サービスにリポジトリを要求すると、新しいインスタンスを返す前にObjectContextを注入します。サービスを破棄すると、コンテキストとすべてのリポジトリが同時に破棄されます。

作業単位ごとに1つのサービスインスタンスを使用します。私の場合、ASP.NET MVCを実行しているため、作業単位は単一の要求に対する応答です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top