C# 使用Unity per request通过注册类型关闭NHibernate会话
我在asp.net webapi中使用FluentNHibernate和Unity。我正在使用工作单元模式来配置ISession 由于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
“会话已关闭,我收到错误信息!对象名称:'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();
}
}
}