2016-02-25 2 views
-1

У меня есть проект ASP.NET MVC 4.0 с уже существующими MVC-контроллерами, однако я бы хотел использовать класс ApiController для некоторых новых функций.ControllerFactory для ApiController в MVC4

Существующая фабрика-контроллер возвращает объект 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; 
    } 
} 

ответ

0

Вы говорите о разных типах контроллеров здесь, один приходит из 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(); 
    } 
} 

вам придется играть с этой идеей, чтобы получить то, что вы хотите. это должно позаботиться о вашей проблеме. Но я все еще не понимаю, почему вы это делаете, поскольку это вызовет проблемы с инъекцией зависимости. я возьму, что у вас есть свои причины.

+0

Tbh Я довольно новичок в asp.net mvc. Я начинаю исследовать ApiController, потому что они, похоже, лучше адаптируются к Backbone.js. Я получаю ошибку компиляции в вашем коде «System.Web.Http.GlobalConfiguration.Configuration» является «свойством», но используется как «тип» –

+0

, какую именно версию пакета mvc вы используете. и что такое версия web api, которую вы используете. вы используете пакеты nuget или ссылки GAC? – Gurpreet

+0

mvc: 4.0.01 api: 2.0.0.0 Я использую ссылки GAC –

Смежные вопросы