c# asp.net-web-api ninject owin bootstrapper

c# - ¿Cómo usar Ninject bootstrapper en WebApi OwinHost Startup?



asp.net-web-api (3)

Además de la publicación de Olif:

  1. install-package ninject.extensions.conventions

  2. En su clase de inicio agregue: usando Ninject.Extensions.Conventions;

  3. En lugar de unir manualmente:

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

Ahora puedes hacer:

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

Esto mirará a través de su montaje, y hará el enlace automáticamente.

Estoy migrando de IIS WebAPI a OwinHost. Utilizando las últimas versiones previas al lanzamiento de los paquetes nuget, usé con éxito las instrucciones aquí:

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

Aquí está el talón de mi código:

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) { ... }

Pero en mi código y en el ejemplo de documentación, el kernel Ninject no se crea hasta después del inicio. Sin embargo, necesito Ninject DI en el proceso de registro de inicio para el registro de Cors y middleware OAuth. Antes de migrar a OwinHost, podría hacer algo como esto:

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); }

Pero internamente, OwinBootstrapper.Execute terminará llamando a CreateKernel y bootstrapper. Inicialice una segunda vez, con malas consecuencias.

¿Cuál es la forma correcta de crear y usar el kernel ninject dentro del inicio y aún registrar el middleware Ninject / WebAPI?


Agregue los siguientes paquetes nuget a su aplicación:

  1. Paquete de instalación Microsoft.AspNet.WebApi.Owin
  2. Install-Package Ninject

Si está utilizando la versión 5.0.0.0 de la API web, también necesita descargar la clase Ninject Resolver del repositorio para evitar problemas de compatibilidad.

Crear un método estático que devuelva un objeto Kernel.

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

Entonces puedes usar ninject en tu clase de inicio

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); } }


Cree el kernel manualmente y luego haga que UseNinjectMiddleware use el mismo en lugar de crear otro.

public void Configuration(IAppBuilder app) { var kernel = CreateKernel() var config = new HttpConfiguration(); config.MapHttpAttributeRoutes(); // USE kernel here app.UseNinjectMiddleware(() => kernel); app.UseNinjectWebApi(config); }