wake-up-neo.com

Wie verwende ich Ninject Bootstrapper in WebApi OwinHost Startup?

Ich migriere von IIS WebAPI zu OwinHost. Unter Verwendung der neuesten Vorabversionen von Nuget-Paketen habe ich die folgenden Anweisungen erfolgreich verwendet:

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

Hier ist ein Teil meines Codes:

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

In meinem Code und im Dokumentationsbeispiel wird der Ninject-Kernel jedoch erst nach dem Start erstellt. Ich benötige Ninject DI jedoch für die Registrierung beim Start von Cors- und OAuth-Middleware. Vor der Migration zu OwinHost konnte ich Folgendes tun:

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

Intern ruft OwinBootstrapper.Execute jedoch am Ende CreateKernel und bootstrapper.Initialize ein zweites Mal mit schlechten Konsequenzen auf.

Was ist der richtige Weg, um den ninject-Kernel in Startup zu erstellen und zu verwenden und trotzdem die Ninject/WebAPI-Middleware zu registrieren?

18
tikinoa

Fügen Sie Ihrer Anwendung die folgenden Nuget-Pakete hinzu:

  1. Installationspaket Microsoft.AspNet.WebApi.Owin
  2. Installationspaket Ninject

Wenn Sie die Web-API-Version 5.0.0.0 verwenden, müssen Sie auch die Klasse Ninject Resolver vom Repo herunterladen, um Kompatibilitätsprobleme zu vermeiden.

Erstellen Sie eine statische Methode, die ein Kernel-Objekt zurückgibt

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

Dann können Sie ninject in Ihrer Startklasse verwenden

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

Erstellen Sie die Variable kernel manuell und legen Sie fest, dass UseNinjectMiddleware dieselbe verwendet, anstatt eine andere zu erstellen.

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

Neben dem Beitrag von Olif:

  1. installationspaket ninject.extensions.conventions

  2. Fügen Sie in Ihrer Startklasse Folgendes hinzu: using Ninject.Extensions.Conventions;

  3. Anstatt manuell zu binden:

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

Sie können jetzt tun:

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

Dadurch wird Ihre Assembly durchgesehen und die Bindung wird automatisch durchgeführt.

1
Virgar Poulsen