2011-08-10 5 views
1

나는 다음과 같은 일반적인 저장소 있습니다폐기 컨텍스트

public class BaseBLL <TEntity> 
     where TEntity : class 
    { 
     protected MyEntities Context { get; set; } 

     public BaseBLL() 
     { 
      this.Context = DataAccessHelper.Context; 
      this.Context.MetadataWorkspace.LoadFromAssembly(typeof(TEntity).Assembly); 
     } 
    } 
:이 비즈니스 계층 여기

public class UserBLL : BaseBLL<User> 
{ 

    EFRepository<User, MyEntities> userRepo = null; 

    public UserBLL() : base() 
    { 
     //Context is created in the consructor of the base class and passed to repository 
     userRepo = new EFRepository<User, MyEntities>(Context); 
    } 
} 

에서 클래스는 기본 비즈니스 클래스입니다

public class EFRepository<TEntity, TContext> : IRepository<TEntity, TContext>, IDisposable 
    where TEntity : class 
    where TContext : ObjectContext 
{ 

    protected TContext context; 

    public EFRepository(TContext context) 
    { 
     this.context = context; 
    } 

    //CRUD methods... 

    public void Dispose() 
    { 
     if (null != context) 
     { 
      context.Dispose(); 
     } 
    } 
} 

이 디자인에서는 내부 클래스가 아닌 비즈니스 클래스 생성자에서 저장소의 인스턴스를 만들고 있기 때문에 using 절을 사용하면 저장소의 dispose 메소드가 기본적으로 호출되지 않습니다. 내 주요 질문은 컨텍스트/저장소가 삭제되었는지 확인하는 방법입니다.

나는 생성자가 아니라 각 메소드 내부에서 using 절로 저장소를 만들 수 있다는 것을 알고 있지만보다 우아한 방법이 있는지 궁금합니다.

일반적인 디자인에 대해서도 자유롭게 의견을 말하십시오.

+0

찾는 http://stackoverflow.com/questions/6987908/what-is-the-best-way-to-instantiate-and-dispose-dbcontext-in -mvc/6990244 # 6990244) – Eranga

답변

2

완전히 잘못되었습니다. 저장소 외부에서 컨텍스트를 작성하므로 저장소가 처분의 책임을 질 수 없습니다. 폐기 처분을 위해 저장소가 구성되는 계층 = BaseBLL은 더 이상 필요하지 않을 때 일회용이어야하며 상위 계층은 올바르게 처분해야합니다.

+0

좋아요, 어떻게 재 설계 하시겠습니까? 그것을 전달하지 않고 저장소 내부에 컨텍스트를 만들겠습니까? 제대로 처리되었는지 어떻게 알 수 있습니까? using 절의 비즈니스 계층에 리포지토리의 인스턴스를 만들겠습니까? –

+0

나는 완전하게 잘못 말한 것이 아니라 단지 부끄럽지 않습니다. 리포지토리는 컨텍스트를 만들 수있을만큼 알지만 컨텍스트의 생성과 연결 문자열을 결합하여 연결합니다. 대신 유니티와 같은 IoC 컨테이너를 사용하여 리포지토리의 생성자에 컨텍스트를 주입합니다. 컨테이너를 통해이 모든 작업을 수행하고 설정 수명이 올 바르면 처분에 대해 걱정할 필요가 없습니다. – Kit

관련 문제