在MVC项目中同时使用MVC控制器和Web ApiController

本文关键字:MVC 控制器 ApiController Web 项目 | 更新日期: 2023-09-27 18:03:02

我有一个相对较大的项目最初创建在MVC 4。但是我想利用OData功能来进行表排序等。

此刻我使用温莎城堡来解决我的MVC控制器。http://blog.devdave.com/2013/04/castle——温莎aspnet - mvc 4. - html

如果我从ApiController继承一个控制器-它不会得到解决,因为:

IController System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)

方法被传递nullcontrollerType

我想实现的是简单地返回IQuerable,并让ApiController按照OData标准进行分页和过滤。

public class OdataController : ApiController
{
    [EnableQuery]
    public IQueryable<Employee> Get()
    {
        using (var repo = _factory.CreateRepository())
        {
            return repo.FilterAsQueryable<Employee>(x => true);
        }
    }
}

有可能在一个项目中实现这一点吗?

在MVC项目中同时使用MVC控制器和Web ApiController

你当然可以在同一个项目中使用web api和mvc控制器,并让它们通过你的Castle Windsor容器来解决依赖关系。

然而,web api控制器和mvc控制器不是从同一个控制器工厂创建的。

您将需要从System.Web.Http.Dependencies程序集创建一个实现IDependencyResolver接口的类。让这个类使用你的容器

如何设置WebApi依赖解析器的语法取决于你使用的WebApi的版本。

WebApi 1

GlobalConfiguration.Configuration.DependencyResolver = new MyCastleWindsorResolver();

请看这篇博文

WebApi 2

var config = new HttpConfiguration();
// set up routing and other web api config and what have you
// ....
// register dependency resolver
config.DependencyResolver = new MyCastleWindsorResolver()