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?
Fügen Sie Ihrer Anwendung die folgenden Nuget-Pakete hinzu:
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);
}
}
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);
}
Neben dem Beitrag von Olif:
installationspaket ninject.extensions.conventions
Fügen Sie in Ihrer Startklasse Folgendes hinzu: using Ninject.Extensions.Conventions;
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.