で遅延実行文の使用: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オブジェクトを返すために良いか悪い習慣ですか?
良いアプローチのようです。私は本当に多くのDIをやったことはありません...使用するライブラリを決める必要があります。あなたは本当に前にDIをやったことがない人のために何をお勧めしますか? – Dismissile
Mark Seemanの本「Dependency Injection in .NET」をお勧めします。つまり、MVCをサポートしているDIフレームワークは、このために使いやすくなります。あまりにも間違って行くことはできません。 –
コンテキスト内でコンストラクタインジェクションを渡しているとき、あなたのリポジトリはローカルにスコープされます。リポジトリをコントローラのインスタンス変数として使用する前に、アクションを正しくコールした後に処分する必要があると思っていませんでしたか? – Dismissile