为什么不';t Asp.net web api控制器源自IController
本文关键字:控制器 api IController web net Asp 为什么不 | 更新日期: 2023-09-27 18:26:10
在ASP.net MVC4中,有一个web API的"新"概念,用于在数据模型上公开CRUD功能。这些控制器的基类是从ApiController
派生而来的DataController
。
不幸的是,这个ApiController
不是从IController
派生的,这是有问题的,因为这些请求不能通过正常的自定义控制器工厂来处理,因为它们应该返回IController
的实例。
有人知道这背后的原因吗?因为我不明白为什么你的MVC项目中会有一个控制器不是从IController
派生的,因为这破坏了你的自定义控制器工厂,因为它无法实例化你项目中的每个控制器。
简而言之,由于这种继承,您无法使用DI容器来注入依赖项。
我也向微软发送了同样的问题,并得到了Eilon Lipton的以下回复(thx):
简而言之,虽然ASP.NET MVC和ASP.NET Web API共享许多相同的设计概念(依赖项注入、大量用于插入自定义实现的接口以及易于测试性),但它们构建在不同的底层HTTP堆栈上。MVC构建在System.Web堆栈上,该堆栈已在ASP.NET中使用了10多年。Web API构建在新的System.Net.Http堆栈上,该堆栈提供了更大的托管灵活性(IIS+自定义主机+单元测试主机)以及更好的可测试性和可扩展性。如果你比较IController和IHttpController,你会发现一个在堆栈上下使用System.Web,而另一个根本不使用它。
不管怎样,所有构建在ASP.NET堆栈上的技术——MVC、Web Forms、Web API、Web Pages(和Razor)——都将继续在应用程序中并行工作,允许您选择正确的部分来构建应用程序的每个部分。虽然每一部分中组件的单独实现是不可互换的,但它们都可以连接到相同的服务,例如依赖注入系统、日志记录工具、数据提供程序等等。
一旦我们发表了关于这个主题的帖子,我认为这应该会进一步澄清问题。
要使用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依赖注入类似(但不完全相同)