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