2016-02-25 64 views
-1

我有一個MVC控制器已存在的ASP.NET MVC 4.0項目,但是我想使用類ApiController來獲得一些新的功能。MVC4中ApiController的ControllerFactory

現有控制器工廠返回一個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引用 –