我正在从 IIS WebAPI 迁移到 OwinHost。利用最新的预发布版本的 nuget 包,我成功地使用了这里的说明:
https://github.com/ninject/Ninject.Web.Common/wiki/Setting-up-a-OWIN-WebApi-application
这是我的代码 stub :
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,您还需要下载 Ninject Resolver class from the repo以避免兼容性问题。
创建一个返回内核对象的静态方法
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);
}
}
关于c# - 如何在 WebApi OwinHost Startup 中使用 Ninject bootstrapper?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23896806/