2009-11-29 2 views
4

MVC 애플 리케이션에서 StructureMap을 사용하기 시작했는데, 내 ITranscation 올바른 방법으로 처리하는 것을 제외하면 모든 것이 잘됩니다.ConstructMap/NHibernate Session per Invoke를 포함한 요청

내가 원하는 것은 각 요청에 대해 새로운 세션을 생성하는 것입니다. 이것과 함께 저는 전이를 시작하고 싶습니다.

요청이 끝날 때 나는 필사본을 저지를 것입니다.

제 질문은 어떻게 구조판으로이 최선의 방법을 사용할 수 있습니까? Google에서 많은 예제를 발견했지만 그 중 아무 것도 요청으로 변환을 시작하지 않으며 내 방법으로이 작업을 수행하고 싶지 않습니다.

미리 감사드립니다.

답변

3
+0

두 번째 링크는 매우 흥미 롭습니다. 너에게 다시 돌아갈 게. 지금까지 감사드립니다. Weston의 블로그는 – jhovgaard

+1

+1입니다. – mxmissile

+0

http://trason.net/journal/2009/10/14/nhibernate-transactional-boundaries.html 멋진 게시물이었습니다! :) – jhovgaard

1

아마 그렇게 쉽지는 않을지 모르지만 여기에 필자가 있습니다. 기본적으로 세션과 트랜잭션을 래핑하고 요청을 저장하고 요청이 끝나면 커밋 또는 롤백하는 작업 단위를 만듭니다.

public class UnitOfWork : IUnitOfWork 
{ 
    private readonly ITransaction _tx; 
    public ISessionFactory SessionFactory { get; set; } 

    public UnitOfWork() 
    { 
     SessionFactory = ObjectFactory.GetNamedInstance<ISessionFactory>(Keys.SessionFactoryName); 
     Session = SessionFactory.OpenSession(); 
     _tx = Session.BeginTransaction(); 
    } 

    public UnitOfWork(ISessionFactory sessionFactory) 
    { 
     SessionFactory = sessionFactory; 
     Session = SessionFactory.OpenSession(); 
     _tx = Session.BeginTransaction(); 
    } 

    public ISession Session { get; private set; } 

    public void Commit() 
    { 
     if (_tx.IsActive) 
      _tx.Commit(); 
    } 

    public void Rollback() 
    { 
     _tx.Rollback(); 
    } 
} 

그냥 EndRequest 이벤트에서 작업 단위를 처분 : 같은

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

구현은 볼 수 있었다.

+0

, 감사합니다! 그럼 그냥 Commit()을 호출하고 IHttpModule의 EndRequest에 처리해야합니까? – jhovgaard

+0

예, 트랜잭션을 커밋 한 후에 처분하지 마십시오 (커밋 후에 삭제됨). 그냥 일하는 단원. – mhenrixon