2011-07-20 11 views
1

で遅延実行文の使用:Entity Frameworkの - 私は、プロジェクトのリストを返す簡単なリポジトリクラスを作成しているのw /リポジトリ

public class ProjectRepository : IProjectRepository 
{ 
    public IQueryable<Project> GetProjects() 
    { 
     DbEntities db = new DbEntities(); 

     return db.Projects; 
    } 
} 

私は後でこのオフ取り組んでいるラインの下のいくつかのコードを持っていますいくつかの並べ替え/ページングを行うためのIQueryable:

public ActionResult Index() 
{ 
    var projectList = (from p in projectRepository.GetProjects() 
         orderby p.Name 
         select p).Take(20); 

    return View(projectList.ToList()); 
} 

私はもともと(私のGetProjectsを包ん)は癖のうちusingステートメントで呼び出す - それはできるだけ早くあなたのオブジェクトを配置することが通常は良いアイデアだから。これは私のコントローラの動作でさらにデータベース作業を行っていたため、問題が分かりやすくなっていました。

ガベージコレクタのときにオブジェクトを破棄させても問題ありませんか?代わりにこれを行うより良い方法はありますか?私のようなより多くのターゲットとリポジトリのメソッドを作成する必要があります。

public IQueryable<Project> GetProjects(int takeThisMany) 
{ 
    return (from p in db.Projects 
      orderby p.Name 
      select p).Take(takeThisMany); 
} 

それは元のコンテキストを配置するかをせずにコントローラのアクションの後の時間に実行されるのIQueryableオブジェクトを返すために良いか悪い習慣ですか?

答えて

2

IQueryable<T>を返信しても問題ありませんが、ObjectContext(常にIDisposableを廃棄してください)、またはリクエストが完了する前に処分しないでください。

Use constructor injection to pass the context to the repository and dispose it at the end of the request.

+0

良いアプローチのようです。私は本当に多くのDIをやったことはありません...使用するライブラリを決める必要があります。あなたは本当に前にDIをやったことがない人のために何をお勧めしますか? – Dismissile

+0

Mark Seemanの本「Dependency Injection in .NET」をお勧めします。つまり、MVCをサポートしているDIフレームワークは、このために使いやすくなります。あまりにも間違って行くことはできません。 –

+0

コンテキスト内でコンストラクタインジェクションを渡しているとき、あなたのリポジトリはローカルにスコープされます。リポジトリをコントローラのインスタンス変数として使用する前に、アクションを正しくコールした後に処分する必要があると思っていませんでしたか? – Dismissile

関連する問題