如何在WebApi OwinHost启动中使用Ninject引导程序
本文关键字:Ninject 引导程序 启动 WebApi OwinHost | 更新日期: 2023-09-27 18:05:20
我正在从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中间件注册的启动注册过程中,我需要NinjectDI。在迁移到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。第二次初始化会产生不良后果。
在Startup中创建和使用ninject内核并注册ninject/WebAPI中间件的正确方法是什么?
将以下nuget包添加到您的应用程序中:
- 安装程序包Microsoft.AspNet.WebApi.Owin
- 安装包Ninject
如果您使用的是5.0.0.0版本的web api,您还需要从repo下载NinjectResolver类,以避免兼容性问题。
创建一个返回内核对象的静态方法
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);
}
}
手动创建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);
}
除了Olif的帖子:
-
安装包ninject.extensions.conventions
-
在您的启动类中添加:using Ninject.Extensions.Conferences;
-
代替手动绑定:
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();
});
这将查看您的程序集,并自动进行绑定。