2013-08-08 3 views
1

최근 IQueryable에서 영감을받은 http://www.codethinked.com/keep-your-iqueryable-in-check을 사용하기 시작했습니다. 그래서 난 내 REPOS에서이 일을하는 데 사용했습니다 :IQueryable을 반환 할 때 DbContext를 처리 할시기/방법?

public IPageable<POCO> GetById(int id) 
{ 
    var ctx = new DbContext() 
    var query = from ...; 
    return new Pageable(query); 
} 

하지만이 new DbContext()을 처리하는 가장 좋은 방법이 있는지 궁금 해요 :

public IEnumerable<POCO> GetById(int id) 
{ 
    using (var ctx = new DbContext()) 
    { 
     var query = from ...; 
     return query.ToList(); 
    } 
} 

지금 나는이 대신하고 있어요. 는 더 클래스 멤버

public class Repo 
{ 
    private DbContext _ctx = new DbContext(); 
} 

심지어 주사로 DbContext을 배치하는 것입니다 그것의 장점과 단점은 무엇

public class Repo 
{ 
    private DbContext _ctx; 

    public Repo(DbContext ctx) 
    { 
     _ctx = ctx; 
    } 
} 

:

  1. 각각의 방법에 new DbContext가.
  2. a 객체 당 new DbContext (클래스 멤버).
  3. 주입 DbContext.
나는 (그 대답에 영향을해야하는 경우) 그래서

몇 가지 다른 질문을 .InRequestScope();을 사용할 수 있습니다 Ninject에 사용하고

:

  • DbContext가로 유지되는 경우 내 REPO이는 IDisposable을 구현해야 종류 회원?
  • 위의 DbContext 처분을 처리하는 더 좋은 방법이 있습니까?

답변

2

나는 항상 InRequestScope과 함께 DBContext를 주입 할 것입니다. 종속성 삽입의 모든 이점을 제공합니다 .Nject는 DBContext가 IDisposable을 구현하므로주기의 마지막에 DBContext를 처리합니다. 이 부분을 참조하십시오 thread

DI를 사용하면 다른 두 가지 질문이 무의미 해집니다.

0

Entity Framework는 캐싱을 좋아합니다. 응용 프로그램을 끊임없이 변경하고 브라우저에서 다시로드하는 경우 처음로드 할 때로드하는 데 몇 초가 걸리지 만 이후에는 거의 순간적으로 페이지가 표시됩니다. 이것은 MVC와 EF가 반복적으로 사용되는 일반적인 쿼리를 캐싱하기 때문에 앱이 초기 로딩 시간 이후에 더 빠르게 사용하기 때문입니다.

이 때문에 DBContext를 만들면 큰 문제가되지 않습니다. 예, 아무것도 만드는 데는 시간이 걸립니다. 그러나 EF는 이러한 쿼리를 인식하고 컨텍스트의 새 인스턴스를 방금 만든 경우에도 빠르게 쿼리를로드합니다.

응용 프로그램에 많은 양의 쿼리가없는 경우 DbContext 주변에 Using 블록을 사용하는 것이 이상적인 것으로 간주되지만 (이는 처리를 처리하므로) 런타임과 메모리 사용 결과는 무시할 수 있습니다.