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 컨테이너의 작업에 더 많은 작업을 넣으려고했지만 사실은 한 걸음 뒤로 물러 섰습니다. 두 가지 구현에 대한 귀하의 생각은 무엇입니까?
어떻게 그런 종류의 설정에서 개별 거래를 처리합니까? 동일한 세션 내에서 두 개의 별도 코드 세트를 실행해야하며 각 트랜잭션마다 고유 한 트랜잭션이 있다고 가정 해 보겠습니다. 어떻게 처리하겠습니까? – Chris
트랜잭션은 세션을 통해 처리됩니다. 트랜잭션을 사용하기 위해 세션 참조가 필요하지 않습니다. –
NHibernate 세션은 기본적으로 자체 작업 단위입니다. 자신의 작업 단위 (UOW) 인터페이스 뒤에 숨기는 이유는 기본적으로 NHibernate에 의존하지 않고 (저장소 외부의) 나머지 응용 프로그램에 일반 방식으로 노출시킬 수 있기 때문입니다. 그리고 그것은 대부분 요청의 처음에 그것을 초기화하고 마지막에 커밋하는 것입니다. –