在ASP.net MVC4中,有一个用于在数据模型上公开CRUD功能的Web API的“新”概念。这些控制器的基类是DataController
,它派生自ApiController
。
不幸的是,这个ApiController
并非来自IController
这是有问题的,因为这些请求无法通过普通的自定义控制器工厂处理,因为它们应该返回{{1}的实例}。
有没有人知道这背后的原因,因为我无法理解为什么你的MVC项目中的控制器不会派生自IController
,因为这会破坏你的自定义控制器工厂,因为它无法实例化项目中的每个控制器。
简而言之,由于这种继承,您无法使用DI容器来注入依赖项。
答案 0 :(得分:7)
我也向微软发送了同样的问题,得到了Eilon Lipton的以下回复(thx for the):
简短的故事是,虽然ASP.NET MVC和ASP.NET Web API共享许多相同的设计概念(依赖注入,许多接口以插入自定义实现,并且易于测试),但它们构建在不同的底层HTTP堆栈。 MVC建立在已在ASP.NET中使用了10多年的System.Web堆栈之上。 Web API构建在新的System.Net.Http堆栈上,为托管(IIS +自定义主机+单元测试主机)提供了更大的灵活性,以及更好的可测试性和可扩展性。如果比较IController和IHttpController,你会发现在堆栈中上下使用System.Web,而另一个根本不使用它。
无论如何,构建在ASP.NET堆栈上的所有技术 - MVC,Web窗体,Web API,Web页面(和Razor) - 将继续在应用程序中并行工作,允许您选择合适的部分来构建应用程序的每个部分。虽然每个部分中的组件的单独实现是不可互换的,但它们每个都可以连接到相同的服务,例如依赖注入系统,日志工具,数据提供者等等。
一旦我们发表关于这个主题的帖子,我认为应该进一步澄清事情。
答案 1 :(得分:1)
要使用ASP.Net WebAPI进行DI,您需要为DI容器制作一个依赖性解析器。
以下适用于Ninject
public class NinjectDependencyResolver : System.Web.Http.Services.IDependencyResolver
{
private static IKernel m_Kernel;
public NinjectDependencyResolver()
{
m_Kernel = new StandardKernel();
}
public NinjectDependencyResolver(IKernel myKernel)
{
m_Kernel = myKernel;
}
public object GetService(Type serviceType)
{
return m_Kernel.TryGet(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return m_Kernel.GetAll(serviceType);
}
}
然后使用:
将其绑定在Global.ascx文件中GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new NinjectDependencyResolver(yourKernel));
这与MVC3依赖注入类似(但不完全相同)