У меня есть метод действия, который возвращает все книги библиотеки, указав libraryId
. Должен ли метод действия быть помещен в LibraryController
или в BookController
?
Существует много методов действия в контроллерах, и контроллеры названы в соответствии с сущностями: BookController, LibraryController, OrderController, LoginController.
Для этого может быть два правила.
1. Конечные точки, организованные по URL-адресу (URL-адрес один и тот же, тип объекта отличается)
Конечная точка с URL-адресом /library/{libraryId}/books
, возвращающим список книг, должна быть помещена в LibraryController, а конечная точка с URL-адресом /book/{bookId}
, возвращающим одну книгу, должна быть помещена в BookController.
/library/{libraryId}/books => LibraryController
/book/{bookId} => BookController
Example:
[ApiController]
[Route("/library")]
public class LibraryController
{
[HttpGet]
[Route("{libraryId}/books")]
public async Task<ActionResult<IList<Book>> GetBooks([FromRoute] Guid libraryId)
{
return await bookService.GetBooks(libraryId);
}
}
[ApiController]
[Route("/book")]
public class BookController
{
[HttpGet]
[Route("{bookId}")]
public async Task<ActionResult<Book>> GetBook([FromRoute] Guid bookId)
{
return await bookService.GetBook(bookId);
}
}
2. Конечные точки, организованные возвращаемой сущностью (URL-адрес отличается, тип сущности одинаковый)
Конечная точка с URL /library/{libraryId}/books
, возвращающая список книг, и конечная точка с URL /book/{bookId}
, возвращающая одну книгу, должны быть помещены в BookController
, поскольку они возвращают Book
сущность и список Book
сущностей.
/library/{libraryId}/books => BookController
/book/{bookId} => BookController
Example:
[ApiController]
public class BookController
{
[HttpGet]
[Route("/book/{bookId}")]
public async Task<ActionResult<Book>> GetBook([FromRoute] Guid bookId)
{
return await bookService.GetBook(bookId);
}
[HttpGet]
[Route("/library/{libraryId}/books")]
public async Task<ActionResult<IList<Book>> GetBooks([FromRoute] Guid libraryId)
{
return await bookService.GetBooks(libraryId);
}
}
Какое правило вы используете и почему?
Примечание: я добавил примеры