C# 如何在WebApi OwinHost启动中使用Ninject引导程序?
我正在从IIS WebAPI迁移到OwinHost。利用nuget软件包的最新预发布版本,我成功地使用了以下说明: 这是我的代码存根:C# 如何在WebApi OwinHost启动中使用Ninject引导程序?,c#,asp.net-web-api,ninject,owin,bootstrapper,C#,Asp.net Web Api,Ninject,Owin,Bootstrapper,我正在从IIS WebAPI迁移到OwinHost。利用nuget软件包的最新预发布版本,我成功地使用了以下说明: 这是我的代码存根: public void Configuration(IAppBuilder app) { var config = new HttpConfiguration(); config.MapHttpAttributeRoutes(); app.UseNinjectMiddleware(CreateK
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软件包添加到应用程序中:
public static class NinjectConfig
{
public static IKernel CreateKernel()
{
var kernel = new StandardKernel();
//Create the bindings
kernel.Bind<IProductsRepository>().To<ProductRepository>();
return kernel;
}
}
手动创建
内核
,然后使useinjectmiddleware
使用相同的内核,而不是创建另一个
public void Configuration(IAppBuilder app)
{
var kernel = CreateKernel()
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
// USE kernel here
app.UseNinjectMiddleware(() => kernel);
app.UseNinjectWebApi(config);
}
除了Olif的职位外:
这将检查您的程序集,并自动进行绑定。我尝试了许多组合,以使我的Owin+WebApi工作。多亏了你,我才解决了这个问题。答案中唯一缺少的包是Ninjec.Web.Common。非常感谢。谢谢你这么好的回答!我已经找了很久了
config.dependencysolver=new NinjectResolver(new Ninject.Web.Common.Bootstrapper().Kernel)代码>这是唯一对我有效的解决方案!无论我做了什么,尝试使用app.usenjectMiddleware
和app.usenjectWebAPI
都会给我“InvalidOperationException:序列不包含元素”。另外,我没有“从repo下载Ninject解析器类”,而是为WebApiContrib.IoC.Ninject
安装了NuGet软件包,这对我很有效,我只是在statup.cs配置函数的末尾调用了解析器。config.dependencysolver=new ninjecthttpdependencysolver(new Ninject.Web.Common.Bootstrapper().Kernel);NinjectHttpDependencyResolver是我的解析器类,我也一直在努力解决这个问题,发现这个问题非常有帮助:
public void Configuration(IAppBuilder app)
{
var kernel = CreateKernel()
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
// USE kernel here
app.UseNinjectMiddleware(() => kernel);
app.UseNinjectWebApi(config);
}
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();
});