我正在寻找有关使用WebAPI 2的最佳实践的建议和建议:
假设我有两个控制器(用户和书籍),并且希望接受这些路线:
/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]。
提前多多感谢!我一直在努力为常见情况找到更好的解决方案和做法。
答案 0 :(得分:2)
我喜欢将返回实体的所有路由放在同一个控制器上。所以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);
}
}
现在任何返回Books的路由都应该在此控制器上。返回Users的任何路由都将放在UsersController上。这有助于我们保持组织和简化,因为Route属性可以放置在任何控制器上,您可以非常轻松地在任何控制器上定义任何路径,这使得难以跟踪所有可能的路线。