2009-11-29 27 views
4

我剛開始在我的MVC應用程序中使用StructureMap,並且一切都很好,除了處理我的ITranscation正確的方式。StructureMap/NHibernate會話每請求包括不斷transcation

我想要做的是在每個請求上創建一個新的ISession。與此一起,我想開始一次交易。

在請求結束時我會提交transcation。

我的問題是,我怎樣才能用StructureMap來做到這一點。我在Google上發現了很多例子,但是他們都沒有開始與請求進行交涉,而且我真的不想在我的方法中這樣做。

在此先感謝!

回答

1

這可能不那麼容易,但這是我的要求。創建基本上包裝會話和事務的工作單元,並在請求結束時存儲該請求並提交或回滾。然後

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

實現可能看起來像:

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就處置工作的單位。

+0

這看起來正是我需要的,謝謝! 我應該在我的IHttpModule中調用Commit()並處理EndRequest嗎? – jhovgaard

+0

是的,不要試圖在您提交之後處理事務(它會在提交後處置)。只是工作單位。 – mhenrixon