【问题标题】:ServiceStack NHibernate and Ninject in Self Hosting App (Request Context)自托管应用程序中的 ServiceStack NHibernate 和 Ninject(请求上下文)
【发布时间】:2012-08-31 13:45:09
【问题描述】:

我有一个自托管的 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();
    }
});

【问题讨论】:

    标签: nhibernate request ninject servicestack


    【解决方案1】:

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

    【讨论】:

    • 我找不到 IRelease 接口。无论如何,我可以将 Release 方法放在 AppHost 上,实例对象是 RestServiceBase 类型。我不需要从 NHibernate 发布这个但 ISession。 Isession 是 Service 的属性,当服务被释放时它不会被破坏(不调用 NInject OnDeactivation 方法)。
    猜你喜欢
    • 2014-11-19
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    相关资源
    最近更新 更多