我正在从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第二次调用,造成不良后果。
如何正确地在启动过程中创建和使用Ninject内核,并仍然注册Ninject/WebAPI中间件?