문제

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);
    }

    // ...
}

이 이전 디자인을 사용하면 사용 명령문 내에서 Worksoffactory에서 작업 단위를 만들어 코드에서 작업 단위의 수명주기를 제어 할 수있었습니다. 나는 IOC 컨테이너의 손에 더 많은 작품을 넣으려고 노력했지만 실제로 한 걸음 뒤로 물러 났다고 생각합니다. 어느 구현에 대한 당신의 생각은 무엇입니까?

도움이 되었습니까?

해결책

일반적으로 IOC 컨테이너가 가능한 한 많이 처리하도록하는 것이 좋습니다. 웹에서 작업 단위는 일반적으로 요청 시작시 초기화되고 끝에 커밋됩니다 (예외가있는 경우 롤백). 이렇게하면 저장소가 단위로 워크 대신 생성자에서 ISSESSION을 취합니다. 이런 식으로, 저장소는 커밋이나 다른 것을 처리 할 필요가 없으며이를 위해 자동으로 처리됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top