2015-06-11 3 views
1

я ищу советы и предложения о наилучшей практике при работе с WebAPI 2:WebAPI как работать с вложенными ресурсами?

Допустит, у меня есть два контроллера (пользователи и книга), и что хотел бы принять эти маршруты:

/users/{user_id}/books <= books owned by user_id 

/books <= all books 
/books/{book_id} <= book from id 

Какая была бы лучшая практика для работы с/users/{user_id}/books? Я имею дело с множеством настраиваемых маршрутов в REST API, поэтому я использую методы [RoutePrefix] и [Verb, Route] для методов.

Большое спасибо! Я всегда стараюсь найти лучшие решения и практики для обычных ситуаций.

ответ

1

Мне нравится ставить все мои маршруты для возвращаемого объекта на том же контроллере. Таким образом, BooksController будет выглядеть так:

public sealed class BooksController : ApiController 
{ 
    //Ideally this Repository would be a dependency injected object 
    private readonly IRepository<Book> _repo = new BooksRepo(); 

    [Route("books")] 
    [HttpGet] 
    public IQueryable<Book> GetAll() 
    { 
     return _repo.GetAll(); 
    } 

    [Route("books/{bookId:int}")] 
    [HttpGet] 
    public Book GetById(int bookId) 
    { 
     return _repo.GetById(bookId); 
    } 

    [Route("users/{userId:int}/books")] 
    [HttpGet] 
    public IQueryable<Book> GetBooksByUser(int userId) 
    { 
     return _repo.GetByUser(userId); 
    } 

    [Route("users/{userId:int}/books/{bookId:int}")] 
    [HttpGet] 
    public Book GetUsersBook(int userId, int bookId) 
    { 
     return _repo.GetByUser(userId).FirstOrDefault(book => book.Id == bookId); 
    } 
} 

Теперь на этом контроллере должен быть любой маршрут, который возвращает Книги. Любой маршрут, который возвращает пользователей, будет помещен в UserController. Это помогло нам сохранить упорядоченное и упрощенное устройство, так как атрибут Route может быть размещен на любом контроллере, вы можете легко определить любой маршрут, определенный на любом контроллере, что затрудняет отслеживание всех возможных маршрутов.

+0

Спасибо за ответ, я закончил делать что-то подобное! – SlashJ

+0

Это хороший ответ, но есть лучший вариант -> https://stackoverflow.com/questions/9594671/nested-resources-in-asp-net-mvc-4-webapi/16094056#16094056 –

+0

@ AndreyMorozov " лучше "на основе ОП. Как говорится в этом вопросе, существует множество настраиваемых маршрутов и использование маршрутизации атрибутов. Ответ, который вы опубликовали, использует общую маршрутизацию и требует контроллера для сопоставленного маршрута. Огромная красота WebApi - это гибкость, которую мы имеем. Лучше относительный. – ManOVision

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