20

Ninject を使用する MVC 5 アプリケーションがあり、それに Hangfire を追加しています。

Ninject を追加したときはNinjectWebCommon、構成が簡単な nuget パッケージを使用しました。したがって、今のところ Ninject はNinjectWebCommon、標準カーネルを作成してバインディングを追加するクラスを通じて構成されています。

さらに、カーネルの作成時にロードするカスタム モジュールをいくつか作成しました。

private static IKernel CreateKernel() {
    var kernel = new StandardKernel( new MyCustomModule() );
    try {
        kernel.Bind<Func<IKernel>>().ToMethod( ctx => () => new Bootstrapper().Kernel );
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        RegisterServices( kernel );
        return kernel;
    }
    catch {
        kernel.Dispose();
        throw;
    }
}

Ninject Web Common はWebActivatorExクラスを通じて登録されます

[assembly: WebActivatorEx.PreApplicationStartMethod( typeof( MyProject.Web.NinjectWebCommon ), "Start" )]
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute( typeof( MyProject.Web.NinjectWebCommon ), "Stop" )]

この問題は、Hangfire を作成して Ninject 構成を表示する方法に関連しています。パッケージを見れHangfire.Ninjectば読める

このパッケージは、IGlobalConfiguration インターフェイスの拡張メソッドを提供します。

var kernel = new StandardKernel(); GlobalConfiguration.Configuration.UseNinjectActivator(kernel);

今私の質問は次のとおりです。

  • このインターフェイスのためIGlobalConfiguration、Hangfire Ninject 構成を OWIN スタートアップ メソッド内 (Hangfire 構成が既に配置されている場所) に追加する必要があります。現在の Ninject カーネル (NinjectWebCommon が構成したもの) を取得するにはどうすればよいですか?
  • 実行順序はどうですか?WebActivatorEx実行は OWIN の起動前ですか、それとも起動後ですか?
  • 構成を 2 回実行しようとするとどうなりますか?

より一般的には、2 つの間で Ninject 構成を共有するにはどうすればよいですか?

4

1 に答える 1

12

現在の Ninject カーネルを取得するにはどうすればよいですか

のコードを見るとNinject.Web.Common.Bootstrapper、カーネルの単一の静的インスタンスが格納され、Kernelプロパティを介して公開されていることがわかります。これは、OWIN スタートアップ メソッド内でこれを実行できることを意味します。

GlobalConfiguration.Configuration.UseNinjectActivator(
                                     new Ninject.Web.Common.Bootstrapper().Kernel);

同じIKernelインスタンスがあり、構成したバインディングがすべて含まれていますNinjectWebCommon.RegisterServices

実行順序はどうですか?WebActivatorEx実行は OWIN の起動前ですか、それとも起動後ですか?

前。それぞれにブレークポイントを設定することで、(私が行ったように) これを確認できます。より詳しい情報

より一般的には、2 つの間で Ninject 構成を共有するにはどうすればよいですか?

構成を 2 回実行しようとするとどうなりますか?

カーネル構成は「構成ルート」です。この分野の著名な専門家である Mark Seemann によると、アプリケーションにはこれらのうちの 1 つのみが存在し、アプリケーションのエントリ ポイントにできるだけ近い場所に配置する必要があります。

于 2015-06-23T21:46:48.277 に答える