1

私は次のブートストラップを持っています

public class NancyBootStrapper: DefaultNancyBootstrapper
{
    protected override void ConfigureRequestContainer(TinyIoC.TinyIoCContainer container, NancyContext context)
    {
        base.ConfigureRequestContainer(container, context);

        var ravenSession = container.Resolve< IRavenSessionProvider >().GetSession();
        container.Register( ravenSession );
    }
}

Nancyアプリが次のコンストラクターを使用してBlogServiceをインスタンス化しようとしたとき

    public BlogService(IDocumentSession documentSession)
    {
        this.documentSession = documentSession;
    }

アプリケーションが爆発し、ドキュメントセッションを解決できないことを示します。また、テストメソッド内で次のことを試しました(コンストラクターインジェクションを削除しました)。

    public void BuildCategories()
    {
        var container = TinyIoCContainer.Current;
        documentSession = container.Resolve< IDocumentSession >();
        documentSession.Store(new Category{Title = "test"});
        documentSession.Store(new Category{Title = ".net"});

        documentSession.SaveChanges();
    }

これも爆発し、documentSessionを解決できないことを指摘します。

NancyFXまたはTinyIoCを使用したのはこれが初めてなので、documentSessionはNancyモジュール内で解決されることに言及する必要がありますが、根本的に間違ったことをしている可能性があります。

誰かが修正やいくつかの提案を提供できますか?

4

2 に答える 2

3

BlogServiceインスタンス化されるのはいつですか?-私の推測では、アプリケーションについては1回です。この場合、セッションを間違ったブートストラッパーメソッドで登録していると思われるので、で登録する必要がありますConfigureApplicationContainer

于 2012-09-04T18:41:39.340 に答える
2

私はNancyFxとTinyIoCの両方のコードベースをプレイして掘り下げており、この問題を修正する方法を見つけました...修正が気に入​​らない...しかしそれはうまくいきます:)

基本的に、ブートストラッパーメソッドconfigureRequestContainerでRavenDBドキュメントセッションを作成しています。これは、要求を作業範囲の単位として使用することがベストプラクティスであるためです。

残念ながら、configureApplicationContainer内のtinyIoCによって自動配線されるものには、ナンシーリクエストで使用されている子コンテナ(MultiInstanceまたはPerRequestSingletonとしてマークされているものを含む)を使用してコンストラクタインジェクションが実行されません。

これを回避するには、同じ子コンテナ内のリクエストごとのコンポーネントに依存するコンポーネントを再登録する必要があります。

私が言ったように、私は修正が好きではありませんが、それは最終的には修正です:)

于 2012-09-04T21:12:38.627 に答える