【问题标题】:Share a Kernel between WebAPI and MVC在 WebAPI 和 MVC 之间共享内核
【发布时间】:2014-02-26 12:42:15
【问题描述】:
我有一个简单的 MVC4 网站,它使用 ASP.NET webAPI 和 MVC 页面。
我想对这两种控制器类型都使用 Ninject DI,但我想知道如何做到这一点?
我让 Ninject DI 为 WebAPI 工作,但现在不知道如何优雅地共享同一个内核。
我应该使用依赖解析器都可以引用的某种内核单例吗?
有人有这方面的经验吗?
干杯。
【问题讨论】:
标签:
asp.net-mvc-4
asp.net-web-api
ninject
ninject.web.mvc
【解决方案1】:
您应该为单个应用程序级组合根使用相同的 IKernel 实例,可以是 WebApi 或 MVC 控制器。
如果您使用的是 Ninject.MVC3 包:
当内核在App_Start 文件夹内的NinjectWebCommon.cs 中初始化时,您已经可以访问它了。对于 MVC 控制器,您无需为 Ninject DI 执行任何其他操作。
但是对于WebAPI 控制器,您需要使用DependencyResolver 将依赖项注入您的控制器。将此解析器使用 this implementation,然后将其设置为所有 WebAPI 控制器的解析器,如下所示:
-
将NinjectDependencyResolver 绑定到self(可选),在NinjectWebCommon.cs 中的RegisterServices 内:
kernel.Bind<NinjectDependencyResolver>().ToSelf();
-
设置WepAPI 配置以使用您的解析器,通常在WebApiConfig.cs 内:
public static void Register(HttpConfiguration config)
{
//Other initialization code
config.DependencyResolver = (new Bootstrapper()).Kernel.Get<NinjectDependencyResolver>();
}
这将适合共享相同IKernel 的所有控制器的场景。
希望有帮助!
【解决方案2】:
是的,你是对的。一个应用应该有一个kernel/container,这样可以避免以后可能出现的错误.只有在花时间调试之后,你才能找出问题所在等等。
此外,使用单个内核,您不必多次注册同一个实现。