NHIBERNATE会话使用UNITY使用Unity进行关闭,并使用Unity进行关闭



我正在使用fluentnhibernate和Unity在我的ASP.NET WebAPI中使用。我正在使用工作模式来配置Isession。

我遇到了错误,因为"Session is closed! Object name: 'ISession'.谁能帮助我在这里做错了什么?请在下面找到我的代码。

UnityConfig:

container.RegisterType<IUnitOfWork, UnitOfWork>(new ContainerControlledLifetimeManager());
public class UnitOfWork : IUnitOfWork
{
    private static readonly ISessionFactory _sessionFactory;
    private ITransaction _transaction;
    public ISession Session { get; set; }
    static UnitOfWork() 
    {
        _sessionFactory = Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008.ConnectionString(x => x.FromConnectionStringWithKey("UnitOfWorkExample")))
            .Mappings(x => x.AutoMappings.Add(
                AutoMap.AssemblyOf<Product>(new AutomappingConfiguration()).UseOverridesFromAssemblyOf<ProductOverrides>()))
            .ExposeConfiguration(config => new SchemaUpdate(config).Execute(false, true))
            .BuildSessionFactory();
    }
    public UnitOfWork()
    {
        Session = _sessionFactory.OpenSession();
    }
    public void BeginTransaction()
    {
        _transaction = Session.BeginTransaction();
    }
    public void Commit()
    {
        try
        {
            if (_transaction != null && _transaction.IsActive)
                _transaction.Commit();
        }
        catch 
        {
            if (_transaction != null && _transaction.IsActive)
                _transaction.Rollback();
            throw;
        }
        finally
        {
            Session.Dispose();
        }
    }
    public void Rollback()
    {
        try
        {
            if (_transaction != null && _transaction.IsActive)
                _transaction.Rollback();
        }
        finally
        {
            Session.Dispose();
        }
    }
}

WebAPI操作过滤器:

public class UnitOfWorkActionFilter : ActionFilterAttribute
{
    public IUnitOfWork UnitOfWork { get; set; }
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        UnitOfWork = actionContext.Request.GetDependencyScope().GetService(typeof(IUnitOfWork)) as IUnitOfWork;
        UnitOfWork.BeginTransaction();
    }
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        UnitOfWork = actionExecutedContext.Request.GetDependencyScope().GetService(typeof(IUnitOfWork)) as IUnitOfWork;
        if (actionExecutedContext.Exception == null)
        {
            // commit if no exceptions
            UnitOfWork.Commit();
        }
        else
        {
            // rollback if exception
            UnitOfWork.Rollback();
        }
    }
}

使用PerRequestLifetimeManager代替ContainerControlledLifetimeManager,然后查看。containerControlledLifetimeManager将现有对象注册为单身实例,这不是您想要的。

有关更多信息,请参阅此信息MSDN

最新更新