【问题标题】:ControllerFactory for ApiController in MVC4MVC4 中 ApiController 的 ControllerFactory
【发布时间】:2016-02-25 19:59:32
【问题描述】:

我有一个已经存在 MVC 控制器的 ASP.NET MVC 4.0 项目,但是我想使用 ApiController 类来实现一些新功能。

现有的控制器工厂返回一个IController 对象,ApiController 不继承自该对象。为ApiController 派生控制器创建另一个控制器工厂并使两个工厂共存的最佳方法是什么?

ControllerBuilder.Current.SetControllerFactory((IControllerFactory)new BuilderControllers.BuilderControllerFactory());

public class BuilderControllerFactory :IControllerFactory
{
    public IController CreateController(RequestContext requestContext, string controllerName)
    {
        string controllerType = string.Format("BuilderControllers.{0}Controller", controllerName);
        IController controller = null;
        try
        {
            controller = Activator.CreateInstance(Type.GetType(controllerType)) as IController;
        }
        catch (System.Exception x)
        {
            //-- handle any failed requests --
        }
        return controller;
    }
}

【问题讨论】:

  • 我也有 MVC 4 解决方案,但我直接在解决方案中添加了 ApiController,它无需自定义控制器工厂即可工作。

标签: c# asp.net asp.net-mvc controller


【解决方案1】:

您在这里谈论不同类型的控制器,一种来自IController,另一种来自IHttpController。保留您现有的 MVC 控制器工厂并添加

GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator),new MyControllerActivator());
        GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector),new MyControllerSelector());

public class MyControllerActivator : IHttpControllerActivator
{
    public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
    {
        throw new NotImplementedException();
    }
}
public class MyControllerSelector : IHttpControllerSelector
{
    public HttpControllerDescriptor SelectController(HttpRequestMessage request)
    {
        return new HttpControllerDescriptor() {ControllerName="SomeController",ControllerType=typeof(MyApiController),Configuration=GlobalConfiguration.Configuration};
    }

    public IDictionary<string, HttpControllerDescriptor> GetControllerMapping()
    {
        throw new NotImplementedException();
    }
}

你必须尝试这个想法才能得到你想要的。 这应该可以解决您的问题。但我仍然不明白你为什么要这样做,因为这会导致依赖注入问题。我会认为你有你的理由。

【讨论】:

  • Tbh 我对 asp.net mvc 还很陌生,我开始探索 ApiController,因为它们似乎更好地适应 Backbone.js。我在您的代码中遇到编译错误“System.Web.Http.GlobalConfiguration.Configuration”是“属性”,但用作“类型”
  • 您使用的 mvc 包的确切版本。以及您使用的是什么版本的 web api。你在使用 nuget 包还是 GAC 引用?
  • mvc: 4.0.01 api: 2.0.0.0 我正在使用 GAC 参考
  • 我没有那个设置。似乎在我的 GAC 中找不到 mvc 4。我需要安装和东西。你认为你有能力删除这些东西的 GAC 引用并改用 nuget。即升级?
  • 问题代码已经贴出来了,还需要什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
相关资源
最近更新 更多