为什么不';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容器来注入依赖项。

为什么不';t Asp.net web api控制器源自IController

我也向微软发送了同样的问题,并得到了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依赖注入类似(但不完全相同)