2012-05-03 2 views
1

엔티티 프레임 워크 4.1 및 mvc3을 사용하여 사이트를 구축 중입니다. 일반 저장소 패턴을 사용하고 있습니다 :
http://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangle. 콘트리트 리포지토리를 컨트롤러에 주입하려면 ninject을 사용합니다. 제 문제는 각각의 dbcontext가 다르고 "동일한 쿼리에서 다른 컨텍스트를 사용할 수 없습니다"와 같은 코드를 외치는 복잡한 쿼리를 실행할 수 없다는 것입니다. 나는 "싱글 톤"접근법을 사용해 보았지만 코드는 "처형 된 객체 (null 참조 예외)를 입력하려고했습니다"와 같은 어떤 것을 소리 쳤습니다. 누구나 내가 뭘 잘못하고 있는지 아이디어가 있습니까?일반 저장소 패턴으로 연결 관리

답변

1

는 싱글 톤 패턴이 반이 당신의 Global.asax에서 설치 (눈물 다운의 종료 요청)입니다 수있는 시작의 요청에 따라 최적의 작업 단위를 시작하는 장소를 찾을 피할 수있는 패턴. 모든 종류의 부작용 (예 : 삭제 된 DbContext)을 사용하여 코드를 테스트하기가 어렵습니다.

UnitOfWork는 다른 리포지토리에서 작업을 관리합니다. 그것은 모든 변경 사항을 추적하고 올바른 순서로 변경 사항을 데이터베이스에 기록합니다. DbContext는 이미 UnitOfWork 패턴을 구현합니다 (사용자 정의 UnitOfWork 인터페이스 뒤에 DbContext를 숨기는 것이 더 좋음).

의존성 주입 물마루 NInject를 이미 사용하고 있다면 거의 완벽합니다! 당신은 DbContext을 위해 저장소의 생성자를 변경해야합니다 :

public class MyRepository 
{ 
    private _unitOfWork; 

    public MyRepository(DbContext unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    } 

    .... 
} 

당신이 다음 작업을해야 InRequestScope mode 모든 것을 Ninject에에 DbContext를 연결하는 경우. 그러면 DbContext가 모든 저장소에서 공유되며 Ninject는 요청이 끝나면이를 처리합니다.

+0

내 저장소의 생성자가 dbContext를 가져와야하고 ninject가 dbcontext를 자동으로 삽입한다는 것을 알 수 있습니까? 컨트롤러에서 호출 될 때 저장소 클래스? –

+0

더하기,이 기사에서 볼 수있는 Generic Repository를 사용하고 있습니다 : http://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangle 저장소 생성자를 사용할 수 있습니까? –

+0

예. 리포지토리의 생성자가 dbContext를 받아 들여야 함을 의미합니다. 그런 다음 NInject를 사용하여 InRequestScope (각 요청에 대해 하나의 공유 dbContext가 있음을 의미)가있는 dbContext를 삽입하면 작동합니다. 지금까지 볼 수 있듯이 GenericRepository는 각 저장소마다 하나씩 생성하는 대신 생성자에서 dbContext를 사용하도록 수정해야합니다. –

0

궁금한 점이 있는지는 잘 모르겠지만 리포지토리는 하나의 dbcontext가있는 "작업 단위 (UOW)"에서 작업 할 수 있어야합니다.

난 당신이

+0

"작업 단위"는 아직 시도하지 않은 것입니다. 왜 "단일 톤"패턴을 사용할 때 null 참조를 얻었는지 말해 줄 수 있습니까? (처분 된 객체에 액세스하려고 시도합니다) –