Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Unity per request通过注册类型关闭NHibernate会话_C#_Asp.net Web Api_Nhibernate_Unity Container - Fatal编程技术网

C# 使用Unity per request通过注册类型关闭NHibernate会话

C# 使用Unity per request通过注册类型关闭NHibernate会话,c#,asp.net-web-api,nhibernate,unity-container,C#,Asp.net Web Api,Nhibernate,Unity Container,我在asp.net webapi中使用FluentNHibernate和Unity。我正在使用工作单元模式来配置ISession 由于“会话已关闭,我收到错误信息!对象名称:'ISession'。有人能帮我解释一下我的错误吗?请在下面查找我的代码 单位配置: container.RegisterType<IUnitOfWork, UnitOfWork>(new ContainerControlledLifetimeManager()); public class UnitOfWor

我在asp.net webapi中使用FluentNHibernate和Unity。我正在使用工作单元模式来配置ISession

由于
“会话已关闭,我收到错误信息!对象名称:'ISession'。
有人能帮我解释一下我的错误吗?请在下面查找我的代码

单位配置:

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();
        }
    }
}

请使用
PerRequestLifetimeManager
而不是
ContainerControlled LifeTimeManager
并参见。ContainerControlled LifeTimeManager将现有对象注册为单例实例,这不是您想要的


有关更多信息,请参见此

从何处获取异常?是否在_transaction=Session.BeginTransaction()行的
UnitOfWork.Commit();
上;当我第一次向webapi发出请求时,它会工作,但第二次发出请求时,它不会调用构造函数。我想这是应该在这里做的事情?那么可能与Unity如何控制对象的生存期有关。查看是否将UnitOfWork的生存期限定为HttpRequest。使用
PerRequestLifeTimeManagerr
而不是
ContainerControlled LifetimeManager
并请参阅。
ContainerControlled LifetimeManager
将现有对象注册为单例实例,这不是您想要的。当我尝试使用此容器时。RegisterType(new PerRequestLifetimeManager());我没有找到PerRequestLifeTimeManager的类型或命名空间是TransientLifeTimeManager吗?当我使用TransientLifeTimeManager时,它起了作用。谢谢查看此链接..不确定为什么找不到命名空间。
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();
        }
    }
}