1

私は自己ホスト型のServiceStackアプリケーションを持っており、リクエストごとにISessionを構築しようとしています。私は以下がうまくいくと思います:

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セッションをこのように処理する正しい方法を教えてもらえますか?

アップデート

次にこれを使用できますか?

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();
    }
});
4

1 に答える 1

0

IOC Container wikiページの下部には、ReleaseIOCリソースの動作が説明されています。破棄されたリソースを処理する最も簡単な方法は、IReleaseメソッドを実装し、リリースされたインスタンスをNinjectに委任することです。例:

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

    //...

    public void Release(object instance)
    {
        this.kernel.Release(instance);
    }
}
于 2012-08-31T19:45:53.197 に答える