1
我有一個自我託管的ServiceStack應用程序,並且我嘗試爲每個請求構建ISession。我想下面的工作:ServiceStack 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接口。無論如何,我可以將Release方法放在AppHost上,實例對象是RestServiceBase類型。我不需要釋放這個,但從NHibernate的ISession。 Isession是Service的屬性,當服務被釋放時它不會被破壞(NInject OnDeactivation方法未被調用)。 –