2016-06-22 2 views
1

FluentNHibernate와 Unity를 사용하여 asp.net webapi에서 사용하고 있습니다. 나는 작업 패턴을 사용하여 ISession을 구성하고 있습니다.요청 당 Unity를 사용하여 등록 된 타입을 통해 NHibernate 세션이 닫히는 경우

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

어디에서 예외가 있습니까? UnitOfWork.Commit();에 있습니다 –

+0

줄에 _transaction = Session.BeginTransaction(); –

+0

내가 webapi에 처음으로 작동하도록 요청할 때,하지만 두 번째로 요청할 때 생성자를 호출하지 않습니다. 여기에 할 일이있는 것 같네요? –

답변

1

사용 PerRequestLifetimeManager 대신 ContainerControlledLifetimeManager 및 참조하십시오. ContainerControlledLifetimeManager는 기존 객체를 사용자가 원하지 않는 싱글 톤 인스턴스로 등록합니다.

자세한 내용은 MSDN

+0

이 컨테이너를 사용하려고 할 때 .RegisterType (새 PerRequestLifetimeManager()); PerRequestLifetimeManager에 대해 형식 또는 네임 스페이스를 찾을 수 없습니다. –

+0

TransientLifeTimeManager가 있습니까? –

+0

TransientLifeTimeManager를 사용할 때 효과가있었습니다. 감사합니다 –