2010-01-15 3 views
13

NHibernate를 사용하여 저장소 패턴을 설정했습니다. 기본 클래스는 다음과 같습니다작업 단위 및 저장소 패턴

public interface IUnitOfWork : IDisposable 
{ 
    void Commit(); 
    void Rollback(); 
} 

// generic NHibernate implementation of IUnitOfWork here 

public class NHibernateRepositoryBase<T> : IRepository<T> 
{ 
    private NHibernateUnitOfWork _unitOfWork; 

    public NHibernateRepositoryBase(NHibernateUnitOfWork unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    } 
    public T Get(object id) 
    { 
     return _unitOfWork.Session.Get<T>(id); 
    } 

    // ... 
} 

당신이 볼 수 있듯이, 내가 작업 단위는 (StructureMap를 사용하여) 생성자를 통해 채울 수 있도록하고있다. 나는 그렇게처럼 내 ASP.NET 웹 서비스에 리포지토리 개체를 채우는 해요 :

당신은 추론 할 수 있습니다으로
[WebService(Namespace = "...")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class ModuleService : System.Web.Services.WebService 
{ 
    public IUserAccountRepository UserAccountRepo { get; set; } 

    public ModuleService() 
    { 
     // tell IoC to inject properties 
     ObjectFactory.BuildUp(this); 
    } 

    // ... 
} 

, 내 문제는 디자인의 방법으로, 지금 라이프 사이클의 제어를 잃은 것입니다 작업 단위의 이전에, 내가 작업 단위에게 상황에 맞는 객체를 만들어 저장소는 같은 것을 통해 참조를 얻을 것이다 :

public class NHibernateRepositoryBase<T> : IRepository<T> 
{ 
    public T Get(object id) 
    { 
     return NHibernateUnitOfWork.GetCurrent().Session.Get<T>(id); 
    } 

    // ... 
} 

이 이전의 디자인은 내 코드에서 작업 단위의 라이프 사이클을 제어 할 수 using 문 내에서 UnitOfWorkFactory로 작업 단위를 작성합니다. IoC 컨테이너의 작업에 더 많은 작업을 넣으려고했지만 사실은 한 걸음 뒤로 물러 섰습니다. 두 가지 구현에 대한 귀하의 생각은 무엇입니까?

답변

3

가능한 한 IoC 컨테이너를 처리하는 것이 좋습니다. 웹에서 작업 단위 패턴은 대개 요청이 시작될 때 초기화되고 마지막에 커밋됩니다 (예외가 있으면 롤백됩니다). 이렇게하면 저장소가 단위 작업 대신 생성자에서 ISession을 가져옵니다. 이렇게하면 저장소가 커밋 또는 기타 사항을 처리 할 필요가 없으며 자동으로 처리됩니다.

+0

어떻게 그런 종류의 설정에서 개별 거래를 처리합니까? 동일한 세션 내에서 두 개의 별도 코드 세트를 실행해야하며 각 트랜잭션마다 고유 한 트랜잭션이 있다고 가정 해 보겠습니다. 어떻게 처리하겠습니까? – Chris

+0

트랜잭션은 세션을 통해 처리됩니다. 트랜잭션을 사용하기 위해 세션 참조가 필요하지 않습니다. –

+3

NHibernate 세션은 기본적으로 자체 작업 단위입니다. 자신의 작업 단위 (UOW) 인터페이스 뒤에 숨기는 이유는 기본적으로 NHibernate에 의존하지 않고 (저장소 외부의) 나머지 응용 프로그램에 일반 방식으로 노출시킬 수 있기 때문입니다. 그리고 그것은 대부분 요청의 처음에 그것을 초기화하고 마지막에 커밋하는 것입니다. –