2012-08-31 18 views
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(); 
    } 
}); 

回答

0

IOC Container wiki page的底部解釋IOC資源Release行爲。處理處置資源的最簡單方法是實現IRelease方法並將已發佈實例委託回Ninject,例如:

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

    //... 

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

我找不到IRelease接口。無論如何,我可以將Release方法放在AppHost上,實例對象是RestServiceBase類型。我不需要釋放這個,但從NHibernate的ISession。 Isession是Service的屬性,當服務被釋放時它不會被破壞(NInject OnDeactivation方法未被調用)。 –

相關問題