Создание API с ASP.NET MVC - все в одном проекте или два проекта?


4

Так что я вернулся. требование создать API для доступа к нашему приложению. Не все действия контроллера покрываются API (возможно, 50%).

Я полагаю, что могу использовать один и тот же проект, проверять заголовки http для каждого запроса и отвечать как xml, JSON, так и html по мере необходимости (как рельсы).

ИЛИ

Создать новое приложение ASP.NET MVC, развернуть @ api.myapp.com и использовать его исключительно для доступа к API.

Предполагаю, что я мог бы написать базовый контроллер для первого варианта обработки 99% работы. Проблема с первым вариантом заключается в том, что нам не нужны (или не нужны) функциональные возможности API, по крайней мере, для половины действий контроллера (и проблема никогда не будет).

Во втором варианте у меня есть дубликат некоторых контроллеров, но хорошие новости - это все/все? мои действия с контроллером - это всего лишь пара строк кода. Обычно:

Whatever whatever = new Whatever(....); 
repository.Save(whatever); 

В любом случае, что думают переполненные стеки?

3

Кажется, что вы хотите создать что-то вроде службы REST. Пожалуйста, посмотрите на this post of Phil Haack.
Да, я уверен, вы можете поместить его в тот же проект. Но лучше будет их отделить (используя области из MvcContrib или контроллеры перемещения api и веб-приложения для разделения сборок, как это сделано в SharpArchitecture.Если ваши контроллеры дублируют много кода, вы можете создать общий контроллер, например:

public class ControllerBase<T, Service> : Controller 
where Service : IService<T> 
{ 
    public Service service { get; set; } 
    public ActionResult Save(int id) 
    { 
     var item = service.Get(id); 
     if (TryUpdateModel<T>(item)) 
     { 
      service.Save(item); 
      return View("Success"); 
     } 
     return View("Error", item); 
    } 
} 

Надеется, что это помогает.


0

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

API: http://example.com/api/widget/list 
App: http://example.com/widget/list 

Вы можете затем использовать столько кода, как это возможно - подтолкнуть выбор данных и другой код в УСК, например. Сохранение его в том же проекте упростит использование вашего кода API через AJAX от клиента.


0

Я думаю, поставив один и тот же код в 2-х различных проектах рожна в долгосрочной перспективе.

Положите все это в одном проекте.

Если вам нужно некоторое различие между регулярными запросами API-интерфейсов, вы можете использовать отдельные маршруты.

После этого вы можете сделать частную функцию, которая выполняет действие, и просто предоставить публике обратившиеся к вам решение сделать в html или JSON/XML