1

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オブジェクトの使用法にあります。

4

1 に答える 1

1

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

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

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

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

于 2009-09-11T13:18:50.690 に答える