web-dev-qa-db-ja.com

WebApi OwinHostスタートアップでNinjectブートストラップを使用する方法

IIS WebAPIからOwinHostに移行しています。nugetパッケージの最新のプレリリースバージョンを使用して、ここの手順を正常に使用しました:

https://github.com/ninject/Ninject.Web.Common/wiki/Setting-up-a-OWIN-WebApi-application

これが私のコードのスタブです:

    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();
        config.MapHttpAttributeRoutes();

        app.UseNinjectMiddleware(CreateKernel);
        app.UseNinjectWebApi(config);
    }

    private static StandardKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Load(Assembly.GetExecutingAssembly());
        RegisterServices(kernel);
        return kernel;
    }

    private static void RegisterServices(IKernel kernel)
    {
        ...
    }

しかし、私のコードとドキュメントの例では、Ninjectカーネルは起動後まで作成されません。ただし、Corsのスタートアップ登録プロセスとOAuthミドルウェア登録でNinject DIが必要です。OwinHostに移行する前に、次のようにすることができます。

public void Configuration(IAppBuilder app)
{
  _bootstrapper = new Bootstrapper();
  _bootstrapper.Initialize(CreateKernel);           

  var config = new HttpConfiguration();
  config.MapHttpAttributeRoutes();

  // USE _boostrapper.Kernel here

  app.UseNinjectMiddleware(CreateKernel);
  app.UseNinjectWebApi(config);
}

しかし、内部的には、OwinBootstrapper.ExecuteがCreateKernelとbootstrapper.Initializeを再度呼び出すことになり、悪い結果を招きます。

スタートアップ内でninjectカーネルを作成して使用し、それでもNinject/WebAPIミドルウェアを登録する正しい方法は何ですか?

18
tikinoa

次のnuget-packagesをアプリケーションに追加します。

  1. インストールパッケージMicrosoft.AspNet.WebApi.Owin
  2. インストールパッケージNinject

Web APIバージョン5.0.0.0を使用している場合は、互換性の問題を回避するために リポジトリからNinject Resolverクラス もダウンロードする必要があります。

カーネルオブジェクトを返す静的メソッドを作成する

public static class NinjectConfig
{
    public static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        //Create the bindings
        kernel.Bind<IProductsRepository>().To<ProductRepository>();
        return kernel;
    }
}

次に、スタートアップクラスでninjectを使用できます

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();
        config.DependencyResolver = new NinjectResolver(NinjectConfig.CreateKernel());

        config.Routes.MapHttpRoute("default", "api/{controller}/{id}", new { id=RouteParameter.Optional });

        app.UseWebApi(config);
    }
}
21
olif

kernelを手動で作成し、UseNinjectMiddlewareに別のものを作成する代わりに同じものを使用させる。

public void Configuration(IAppBuilder app)
{
  var kernel = CreateKernel()

  var config = new HttpConfiguration();
  config.MapHttpAttributeRoutes();

  // USE kernel here

  app.UseNinjectMiddleware(() => kernel);
  app.UseNinjectWebApi(config);
}
5
Shago

Olifの投稿に加えて:

  1. インストールパッケージninject.extensions.conventions

  2. スタートアップクラスに次を追加します。

  3. 手動でバインドする代わりに:

 public static IKernel CreateKernel()
     {
         var kernel = new StandardKernel();
         //Create the bindings
         kernel.Bind<IProductsRepository>().To ProductRepository ();
         return kernel;
     }

これで次のことができます。

kernel.Bind(x =>
                {
                    x.FromThisAssembly()
                    .SelectAllClasses()
                    .BindDefaultInterface();
                });

これはあなたのアセンブリを調べ、自動的にバインドを行います。

1
Virgar Poulsen