2014-12-05 3 views
0

WebAPI имеет соглашение об именах «FooController» для имен контроллеров. Это похоже на ASP.NET MVC. Наша кодовая база использует символы подчеркивания для разделения слов в идентификаторе с именем, например. "Foo_Bar_Object". Чтобы имена контроллеров соответствовали этому соглашению, нам нужен способ назвать наши контроллеры «Foo_Controller».Имена контроллеров WebAPI с символами подчеркивания

В принципе, мы не хотим, чтобы URL-маршруты выглядели как «oursite.com/api/foo_/», и мы не хотим делать исключения во всем мире для подчеркивания (например, config маршрута, имена представления папки и т. д.). Для того, чтобы сделать это в 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

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