2014-12-05 3 views
0

WebAPI에는 컨트롤러 이름에 대해 "FooController"라는 명명 규칙이 있습니다. 이것은 ASP.NET MVC와 유사합니다. 코드베이스는 밑줄을 사용하여 이름이 지정된 식별자에서 단어를 구분합니다. "Foo_Bar_Object". 컨트롤러 이름이이 규칙을 따르기 위해서는 컨트롤러 이름을 "Foo_Controller"로 지정해야합니다.밑줄이있는 WebAPI 컨트롤러 이름

기본적으로 URL 경로가 "oursite.com/api/foo_/"처럼 보이기를 원하지 않으며 밑줄을 위해 어디에서나 예외를 만들 필요가 없습니다 (예 : 경로 구성,보기 이름 폴더 등). MVC에서이 작업을 수행하려면, 우리가 할 :

Global.asax에

protected void Application_Start() { 

    ... 

    ControllerBuilder.Current.SetControllerFactory(new Custom_Controller_Factory()); 
} 

Custom_Controller_Factory.cs

public class Custom_Controller_Factory : DefaultControllerFactory 
{ 
    protected override Type GetControllerType(RequestContext request_context, string controller_name) 
    { 
     return base.GetControllerType(request_context, controller_name + "_"); 
    } 
} 

이 완전히 자리 일단 모든 문제의 처리에 걸릴 것 같다 MVC에서. WebAPI에 대해 동일한 작업을 수행 할 수있는 방법이 있습니까? DefaultHttpControllerFactory에 대한 소문을 들었지만 어디서나 찾을 수는 없습니다.

+0

어 자신이 추가 작업을 모두 만드는 점은 무엇인가? 'My_Class_Name'은 표준이 아니므로 누구나 당신이'MyClassName'과 함께한다고 제안 할 것입니다. –

+0

그것은 순전히 주관적인 것입니다. 또한, 내 가게에서 사용하는 명명 표준을 결정하지 않습니다. 우리는 수십 년 간의 코드베이스 선례를 따라야합니다. – jtheis

답변

2

나는 생각한다 DefaultHttpControllerSelector는 당신이 찾고있는 것이다.

class CustomHttpControllerSelector : DefaultHttpControllerSelector { 

    public CustomHttpControllerSelector(HttpConfiguration configuration) 
     : base(configuration) { } 

    public override string GetControllerName(HttpRequestMessage request) { 

     IHttpRouteData routeData = request.GetRouteData(); 
     string controller = (string)routeData.Values["controller"] 

     return controller + "_"; 
} 

Global.asax에

GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector), new sh_Custom_Http_Controller_Selector(GlobalConfiguration.Configuration)); 
+0

이것은 거의 정확하게 내가 필요로했던 것입니다. 몇 가지 개조로 답변을 업데이트했습니다. 'GetControllerName'은 가상이 아니라 오버라이드해야했습니다. Global.asax에 등록하는 방법에 대한 행을 추가했습니다. 감사! – jtheis

관련 문제