0

CustomBootstrapperは以下のように見えます

public class CustomBootstrapper : DefaultNancyBootstrapper
{
    protected override NancyInternalConfiguration InternalConfiguration
    {
        get
        {
            //This will tell Nancy it won't have to look in the Nhibernate assemblies for implementations of our interfaces.
            return NancyInternalConfiguration
                .Default
                .WithIgnoredAssembly(asm => asm.FullName.StartsWith("NHibernate", StringComparison.InvariantCulture))
                .WithIgnoredAssembly(asm => asm.FullName.StartsWith("Fluent", StringComparison.InvariantCulture))
                .WithIgnoredAssembly(asm => asm.FullName.StartsWith("Iesi", StringComparison.InvariantCulture));
        }
    }

    protected override void ConfigureRequestContainer(TinyIoCContainer container, NancyContext context)
    {
        base.ConfigureRequestContainer(container, context);
        //container.Register((c, p) => SessionFactory.OpenSession());
        container.Register(SessionFactory.OpenSession());
    }
}

ISessionコンストラクターの依存関係として受け入れるリポジトリがあります。アプリケーションを実行すると、次のエラーが表示されますUnable to resolve type: NHibernate.ISession

私はそれを確認することができます

  1. 私のブートストラッパーは Nanacy によってピックアップされます
  2. ISession登録コードが実行されます
  3. .WithIgnoredAssembly(asm => asm.FullName.StartsWith("NHibernate", StringComparison.InvariantCulture))プロパティからコメントアウトしようとしましたInternalConfiguration
  4. コンポーネントを登録する両方の方法でエラーが発生します (1 つは私のコードでコメントされています)。

SOに関する同様の他の質問を見てきましたが、これまでのところ役に立ちませんでした。

4

1 に答える 1

0

Nancy で NH を使用するサンプル プロジェクトを作成しました。私がセットアップしたブートストラップで:

  1. セッションを作成し、それをセッション コンテキストにバインドする BeforeRequest フック
  2. セッションをコミットする AfterRequest フック
  3. ロールバックする OnError フック

コードは次のとおりです。

public class Bootstrapper : WindsorNancyBootstrapper
{

 // other stuff

 protected override void ApplicationStartup(IWindsorContainer container, IPipelines pipelines)
  {
    base.ApplicationStartup(container, pipelines);

    // other setup

    ConfigureNHibernateSessionPerRequest(container, pipelines);
  }

  private void ConfigureNHibernateSessionPerRequest(IWindsorContainer container, IPipelines pipelines)
  {
    pipelines.BeforeRequest += ctx => CreateSession(container);
    pipelines.AfterRequest += ctx => CommitSession(container);
    pipelines.OnError += (ctx, ex) => RollbackSession(container);
  }

  private Response RollbackSession(IWindsorContainer container)
  {
    var sessionFactory = container.Resolve<ISessionFactory>();
    if (CurrentSessionContext.HasBind(sessionFactory))
    {
      var requestSession = sessionFactory.GetCurrentSession();
      requestSession.Transaction.Rollback();
      CurrentSessionContext.Unbind(sessionFactory);
      requestSession.Dispose();
    }
    return null;
  }

  private Response CreateSession(IWindsorContainer container)
  {
    var sessionFactory = container.Resolve<ISessionFactory>();
    var requestSession = sessionFactory.OpenSession();
    CurrentSessionContext.Bind(requestSession);
    requestSession.BeginTransaction();

    return null;
  }

  private AfterPipeline CommitSession(IWindsorContainer container)
  {
    var sessionFactory = container.Resolve<ISessionFactory>();
    if (CurrentSessionContext.HasBind(sessionFactory))
    {
      var requestSession = sessionFactory.GetCurrentSession();
      requestSession.Transaction.Commit();
      CurrentSessionContext.Unbind(sessionFactory);
      requestSession.Dispose();
    }
    return null;
  }    
}
于 2013-04-08T10:47:48.863 に答える