如何在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第二次,结果不好。
在Startup中创建和使用ninject内核并仍然注册Ninject / WebAPI中间件的正确方法是什么?
将以下nuget-packages添加到您的应用程序:
- 安装包Microsoft.AspNet.WebApi.Owin
- 安装包Ninject
如果您使用的是web api 5.0.0.0版,则还需要从repo下载Ninject Resolver类以避免兼容性问题。
创建一个返回Kernel对象的静态方法
public static class NinjectConfig { public static IKernel CreateKernel() { var kernel = new StandardKernel(); //Create the bindings kernel.Bind().To(); 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); } }
手动创建kernel
,然后使UseNinjectMiddleware
使用相同的kernel
,而不是创建另一个。
public void Configuration(IAppBuilder app) { var kernel = CreateKernel() var config = new HttpConfiguration(); config.MapHttpAttributeRoutes(); // USE kernel here app.UseNinjectMiddleware(() => kernel); app.UseNinjectWebApi(config); }
除了Olif的post:
-
install-package ninject.extensions.conventions
-
在你的启动类中添加:using Ninject.Extensions.Conventions;
-
而不是手动绑定:
public static IKernel CreateKernel() { var kernel = new StandardKernel(); //Create the bindings kernel.Bind
().To ProductRepository (); return kernel; }
你现在可以这样做:
kernel.Bind(x => { x.FromThisAssembly() .SelectAllClasses() .BindDefaultInterface(); });
这将查看您的程序集,并自动执行绑定。
- Web Api如何在Swagger中为所有API添加Header参数
- ASP.NET WebApi IExceptionLogger不捕获exception
- System.Net.Http.HttpRequestException将内容复制到流时出错
- 将HttpRequestMessage转换为OwinRequest和OwinResponse转换为HttpResponseMessage
- ASP.NET web api无法获得application / x-www-form-urlencoded HTTP POST
- 从Web APIurl中删除“api”前缀
- 自定义授权属性在WebAPI中不起作用
- 部署webAPI服务器端所需的最小文件
- OData错误:URI中指定的查询无效。 该属性不能在查询选项中使用