2012-08-31 5 views
1

자체 호스팅 ServiceStack 응용 프로그램이 있고 요청 당 Isession을 빌드하려고합니다. 나는 다음은 작동한다고 가정ServiceStack 자체 호스팅 App (요청 컨텍스트)에서 NHibernate 및 Ninject

Bind<ISession>() 
    .ToMethod(NapraviSesiju) 
    .InNamedScope(ControllerScope) 
    .InScope(s => ReuseScope.Request) 
    .OnActivation(s => s.BeginTransaction()) 
    .OnDeactivation(s => 
{ 
    if (!s.Transaction.IsActive) return; 
    try 
    { 
    s.Transaction.Commit(); 
    } 
    catch (Exception e) 
    { 
    s.Transaction.Rollback(); 
    } 
}); 

private ISession NapraviSesiju(IContext kontekst) 
{ 
    var sesija = kontekst.Kernel.Get<ISessionFactory>().OpenSession(); 
    return sesija; 
} 

이 작동하지만, 요청 비활성화가 (이 30 초 또는 1 분 이상이 지난 후 발생, 일부 요청은 모두 비활성화하지 않습니다) 인스턴트 없습니다.

누군가가 이런 식으로 NHibernate 세션을 처리하는 올바른 방법을 말해 줄 수 있습니까?

UPDATE

나는 다음이를 사용할 수 있습니다

public class AppHost : AppHostHttpListenerBase 
{ 
    private IKernel _jezgro; 

    public override void Configure(Container container) 
    { 
     _jezgro = new StandardKernel(new NHibernateModul()); 
     container.Adapter = new NinjectIocAdapter(_jezgro); 
    } 

    public override void Release(object instance) 
    { 
     _jezgro.Release(((IHasSession)instance).Sesija); //Release Sesija from SomeServis object below 
    } 
} 

public class SomeServis : RestServiceBase<Some>, IHasSession //implements NHibernate Session 
{ 
    public ISession Sesija { get; set; } //IHasSession implementation. Injected by Ninject. 
} 

Bind<ISession>() 
.ToMethod(NapraviSesiju) 
.InScope(s => ReuseScope.Request) //reuse per request scope. Is this really needed, since release is happening at Release in AppHost? 
.OnActivation(s => s.BeginTransaction()) 
.OnDeactivation(s => 
{ 
    if (!s.Transaction.IsActive) return; 
    try 
    { 
     s.Transaction.Commit(); 
    } 
    catch (Exception) 
    { 
     s.Transaction.Rollback(); 
    } 
}); 

답변

0

IOC Container wiki page의 바닥은 IOC 자원의 Release 동작을 설명합니다.

public class NinjectIocAdapter : IContainerAdapter, IRelease 
{ 
    private readonly IKernel kernel; 

    //... 

    public void Release(object instance) 
    { 
     this.kernel.Release(instance); 
    } 
} 
+0

내가 IRelease 인터페이스를 찾을 수 없습니다 : 배치 자원을 처리하는 가장 쉬운 방법은 예컨대의 IRelease 메소드를 구현 다시 Ninject에에 출시 인스턴스를 위임하는 것입니다. 어쨌든, 나는 AppHost에 Release 메소드를 넣을 수 있고, 인스턴스 객체는 RestServiceBase 타입이다. 나는 이것을 릴리즈 할 필요가 없지만 NHibernate로부터 Session을 가져올 필요가있다. Isession은 Service의 속성이며 서비스가 릴리스 될 때 파괴되지 않습니다 (NInject OnDeactivation 메서드가 호출되지 않음). –