Asp.net mvc 每个请求的StructureMap/NHibernate会话,包括常量转换

Asp.net mvc 每个请求的StructureMap/NHibernate会话,包括常量转换,asp.net-mvc,nhibernate,structuremap,Asp.net Mvc,Nhibernate,Structuremap,我刚开始在我的MVC应用程序中使用StructureMap,除了以正确的方式处理我的iTransation外,一切都很顺利 我想做的是在每个请求上创建一个新的ISession。与此同时,我想开始一个转换 在请求结束时,我将提交转换 我的问题是,如何使用StructureMap以最佳方式实现这一点。我在Google上找到了很多例子,但是没有一个是通过请求开始转换的,我真的不想在我的方法中这样做 提前谢谢 可能没那么容易,但这是我的看法。创建一个基本上包装会话和事务的工作单元,并将其存储在请求中,然

我刚开始在我的MVC应用程序中使用StructureMap,除了以正确的方式处理我的
iTransation
外,一切都很顺利

我想做的是在每个请求上创建一个新的ISession。与此同时,我想开始一个转换

在请求结束时,我将提交转换

我的问题是,如何使用StructureMap以最佳方式实现这一点。我在Google上找到了很多例子,但是没有一个是通过请求开始转换的,我真的不想在我的方法中这样做


提前谢谢

可能没那么容易,但这是我的看法。创建一个基本上包装会话和事务的工作单元,并将其存储在请求中,然后在请求结束时提交或回滚

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();
    }
}
公共类UnitOfWork:IUnitOfWork
{
专用只读ITransaction_tx;
公共ISessionFactory会话工厂{get;set;}
公共工作单元()
{
SessionFactory=ObjectFactory.GetNamedInstance(Keys.SessionFactoryName);
Session=SessionFactory.OpenSession();
_tx=Session.BeginTransaction();
}
公共工作单元(ISessionFactory sessionFactory)
{
SessionFactory=SessionFactory;
Session=SessionFactory.OpenSession();
_tx=Session.BeginTransaction();
}
公共ISession会话{get;private set;}
公共无效提交()
{
如果(_tx.IsActive)
_tx.Commit();
}
公共无效回滚()
{
_tx.回滚();
}
}

只需按endrequest处理工作单元。

这两篇文章应该会有所帮助


这正是我需要的,谢谢!然后我是否应该在IHttpModule中调用Commit()并在EndRequest上进行dispose?是的,但不要在提交事务后尝试处理它(它在提交后进行处理)。只是工作单元。第二个链接看起来很有趣。我会再打给你的。谢谢你。这是一篇很棒的帖子!:)