2014-04-11 4 views
5

Я использую Web API v2, и у меня есть несколько моделей, для которых мне нужно выполнять операции CRUD. Например, у меня есть модель Allergy и модель Prescription. В самом приложении я имею viewmodels, которые могут превратиться в их соответствующие модели, но для простоты просто скажем, что я беру модель прямо в контроллере Web API.Общий API-интерфейс API

Так что-то вроде этого:

public class PrescriptionsController 
    { 
     public HttpResponseMessage Put(Prescription model) 
     { 
       // saved to the DB 
     } 

     ... (other CRUD operations) 
    } 

У меня также есть то же самое для Allergy модели:

public class AllergiesController 
    { 
     public HttpResponseMessage Put(Allergy model) 
     { 
       // saved to the DB 
     } 

     ... (other CRUD operations) 
    } 

Обе модели имеют различные свойства, но обрабатываются точно так же - на самом деле у меня есть около 3 других моделей, которые обрабатываются точно так же для каждой операции CRUD. Я ненавижу делать 5 различных конечных точек, которые в основном копируются и вставляются в код.

Так что мой вопрос заключается в следующем:

Могу ли я сделать общий контроллер для обработки всех этих моделей? Что-то вроде MyCommonController<T>? (но с лучшим именем, конечно!) Может ли веб-API обрабатывать маршрутизацию в этом сценарии? Это даже хорошая идея?

+0

Я думаю, вы можете достичь этого по-другому .. путем маршрутизации. Я не пробовал, но посмотрю. – Guanxi

+0

Кажется возможным. Обсуждение этого вопроса: http://stackoverflow.com/questions/12077361/generic-webapi-controller – Trisk

ответ

7

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

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

class MyBaseController<TModel> : ApiController 
{ 
    public TModel Get(int id) { ... } 
} 

и имел каждый тип наследует от него:

class PrescriptionsController : MyBaseController<Prescription> { } 

И работал как шарм, не придется возиться с маршрутизацией или что-нибудь. Это дает понять, что происходит, и довольно удобно.

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