我刚开始在我的MVC应用程序中使用StructureMap,一切顺利,除了以正确的方式处理我的ITranscation
。
我想要做的是在每个请求上创建一个新的ISession。与此同时,我想开始一个交易。
在请求结束时,我将提交转账。
我的问题是,如何使用StructureMap以最佳方式完成此操作。我在谷歌上发现了很多例子,但没有一个人开始对请求进行交易,我真的不想在我的方法中这样做。
提前致谢!
答案 0 :(得分:3)
这两篇文章应该有所帮助。
http://trason.net/journal/2009/10/7/bootstrapping-nhibernate-with-structuremap.html
http://trason.net/journal/2009/10/14/nhibernate-transactional-boundaries.html
答案 1 :(得分: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();
}
}
只需在最终请求处理工作单元。