2013-06-18 4 views
2

У меня есть несколько ресурсов, которые я хочу выставить через следующие URIsРуководство ASP.Net Web Api Controller Design

  1. Http: /// страны GET
  2. Http: /// состояний COUNTRYCODE = ** GET
  3. Http: /// человек GET, POST, PUT, DELETE

Я использую Asp.Net Web API для создания RESTful службы для доступа к этому ресурсу.

Что было бы лучшей практикой при создании контроллеров для них? Должен ли я создавать отдельный контроллер для каждого ресурса? Или есть какой-то способ сопоставить эти URL-адреса с действиями одного контроллера?

Один класс контроллера поможет, если я использую DependencyResolver, как я видел, DependencyResolver может возвращать экземпляр одного контроллера. (Возможно, я ошибаюсь)

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

Я не буду использовать ни одного IoC, только DI.

Один Сложение

Я успешно проектировали эту проблему в WCF Web API используется для отдыха, но не в Asp.Net Web API. Я новичок в этом.

ответ

3

Создайте отдельный контроллер для каждого ресурса.

Плохая идея разрушить ваш API, потому что у вас проблемы с DI.

Бесплатно Apigee Web API Design ebook очень короткий, очень хороший и, безусловно, стоит прочитать.

+1

Спасибо Нейлу ... но не получил ваш комментарий «Плохая идея испортить ваш API, потому что у вас проблемы с DI». Если я использовал отдельный контроллер, то как разрешить зависимость конструктора с помощью зависимого преобразователя ?? – Bijit

+0

Привет, Bijit. Может быть, я вас неправильно понял, но это звучало как основная причина, по которой вы рассматривали одного контроллера для стран, штатов и людей, было то, что у вас было какое-то затруднение с автоматическим вводом зависимостей в несколько контроллеров. Если это так, вы можете отправить отдельный вопрос; Если нет, то я плохой. –

+0

У тебя есть Нил. В любом случае я решил проблему с помощью IHttpControllerActivator вместо IDependencyResolver для составления контроллеров. – Bijit

0

Как уже упоминалось выше, Нил, лучшей практикой было бы создать 3 различных контроллеров:

  • CountriesController
  • StatesController
  • PersonsController

Если вы их получения от ApiController, они будут автоматически доступны по следующим адресам:

  • /API/страны
  • /API/состояния
  • /API/чел

Если вы черпаете из контроллера, они будут доступны по следующим адресам:

  • /страны
  • /states
  • /лица

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

Надеюсь, это поможет!

0

Несколько разных URL могут быть сопоставлены действиям одного контроллера в веб-API. Вот как это можно сделать:

В WebApiConfig.cs в папке App_Start, отображение по умолчанию получает автоматически создается как:

public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 

Для отображения методов действий, а также, добавить {action} параметр в routeTemplate в выше маршрут, следующим образом:

  routeTemplate: "api/{controller}/{action}/{id}", 

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

// Reached by /api/controllername/getcountries 
    public IEnumerable<string> GetCountries() 
    { 
     // Custom code 
    } 


    // Reached by /api/controllername/getstates/countrycode 
    public IEnumerable<string> GetStates(string id) 
    { 
     // id contains the countrycode string 
    } 

Убедитесь, что имена методов действий по-прежнему начинаются с HTTP глаголов: Get | Put | Post | Delete, хотя!