2

基本的に私のGlobal.asaxコードには、IKernelこのような Ninject セットアップ用の次のプロパティがあります (Microsoft.Practices.ServiceLocation も利用しています)。このコンテナは、CreateKernel()オーバーライドされたように見えると自動的に呼び出されます。

protected override IKernel CreateKernel()
        {
            return Container;
        }

そして私のコンテナプロパティ:

static IKernel _container;
        public static IKernel Container
        {
            get
            {
                if (_container == null)
                {
                    _container = new StandardKernel();
                    _container.Load(new SiteModule(_container));
                    ServiceLocator.SetLocatorProvider(() => _container.Get<IServiceLocator>());
                }
                return _container;
            }
        }

ご覧のとおり、インターフェイス<->サービスバインディングのリストを定義するモジュールを1つだけロードしていますが、これはこの問題にとって重要ではありませんが、私の問題は-どんなに頑張っても取得できませんmy _ containernull は、MVC Web サイトを再起動したときに最初にインスタンス化されると、再び返されます。Web.config ファイルの編集と再保存 (古き良きトリック) から、アプリケーション プールのフラッシュや IIS の再起動 (!) まで、私のコンテナーまだ存在しているようです。どうしてこうなるのか、私には本当に理解できません。初期ロード_containerが null であり、SiteModule正しくロードされることはわかっています。

新しく作成されたサービスにいくつかの新しいバインディングを追加したいのですが、コンテナが決してnullに戻らないため、これはもちろん問題です:P

ご参考までに。ブレークポイントをコンテナーの null テストに移動しても、これがうまくいかないようです。これで問題が解決しない理由を聞かないでください。エラーはありません。すべてが正常にマップされます。

ありがとう、あなたが見る必要があると感じたらSiteModule()私に知らせてください、そして私はこの投稿をコードで拡張することができます.

4

2 に答える 2

0

私が間違っていなければ、 (ソースを表示CreateKernel())中に一度だけ呼び出されるので、他の場所で使用していない限り、キャッシュするメリットはありますか?Application_Start()Container

このようなことを試しましたか?

protected override IKernel CreateKernel()
{
    IKernel kernel = new StandardKernel();

    // Do your Load() and ServiceLocator stuff here

    return kernel;
}

参考までに、Ninject Web サイトの実装.

于 2010-05-21T20:32:44.320 に答える
0

Web サーバーを再起動してみましたか? これは本番環境ではオプションではないかもしれませんが、開発フェーズを完了する必要があります (機能する場合)。

于 2010-05-20T15:05:06.983 に答える