Язык программирования C#9 и платформа .NET5
Шрифт:
{
[ApiController]
public abstract class BaseCrudController<T, TController> : ControllerBase
where T : BaseEntity, new
where TController : BaseCrudController<T, TController>
{
}
}
Класс является открытым и абстрактным, а также унаследованным от
ControllerBase
. Он принимает два обобщенных параметра типа. Первый
BaseEntity
и иметь стандартный конструктор, а второй — быть производным от BaseCrudController
(для представления производных контроллеров). Когда к базовому классу добавляется атрибут ApiController
, производные контроллеры получают функциональность, обеспечиваемую атрибутом. На заметку! Для этого класса не определен маршрут. Он будет установлен с использованием производных классов.
Конструктор
На следующем шаге добавляются две защищенные переменные уровня класса: одна для хранения реализации интерфейса
IRepo<T>
и еще одна для хранения реализации интерфейса IAppLogging<T>
. Обе они должны устанавливаться с применением конструктора.
protected readonly IRepo<T> MainRepo;
protected readonly IAppLogging<TController> Logger;
protected BaseCrudController(IRepo<T> repo, IAppLogging<TController> logger)
{
MainRepo = repo;
Logger = logger;
}
Методы GetXXX
Есть два HTTP-метода
GET
, GetOne
и GetAll
. Оба они используют хранилище, переданное контроллеру. Первым делом добавьте метод Getll
, который служит в качестве конечной точки для шаблона маршрута контроллера:
/// <summary>
/// Gets all records
/// </summary>
/// <returns>All records</returns>
/// <response code="200">Returns all items</response>
[Produces("application/json")]
[ProducesResponseType(StatusCodes.Status200OK)]
[SwaggerResponse(200, "The execution was successful")]
[SwaggerResponse(400, "The request was invalid")]
[HttpGet]
public ActionResult<IEnumerable<T>> GetAll
{
return Ok(MainRepo.GetAllIgnoreQueryFilters);
}
Следующий метод получает одиночную запись на основе параметра
id
, который передается как обязательный параметр маршрута и добавляется к маршруту производного контроллера:
/// <summary>
/// Gets a single record
/// </summary>
/// <param name="id">Primary key of the record</param>
/// <returns>Single record</returns>
/// <response code="200">Found the record</response>
/// <response code="204">No content</response>
[Produces("application/json")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[SwaggerResponse(200, "The execution was successful")]
[SwaggerResponse(204, "No content")]
[HttpGet("{id}")]
public ActionResult<T> GetOne(int id)
{
var entity = MainRepo.Find(id);
if (entity == null)
{
return NotFound;
}
return Ok(entity);
}
Значение
id
(неявно из [FromRoute]
). Метод UpdateOne
Обновление записи делается с применением HTTP-метода
PUT
. Ниже приведен код метода UpdateOne
:
/// <summary>
/// Updates a single record
/// </summary>
/// <remarks>
/// Sample body:
/// <pre>
/// {
/// "Id": 1,
/// "TimeStamp": "AAAAAAAAB+E="
/// "MakeId": 1,
/// "Color": "Black",
/// "PetName": "Zippy",
/// "MakeColor": "VW (Black)",
/// }
/// </pre>
/// </remarks>
/// <param name="id">Primary key of the record to update</param>
/// <returns>Single record</returns>
/// <response code="200">Found and updated the record</response>
/// <response code="400">Bad request</response>
[Produces("application/json")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[SwaggerResponse(200, "The execution was successful")]
Поделиться:
Популярные книги
Убивать чтобы жить 3
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Герцогиня в ссылке
2. Магия стихий
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Шатун. Лесной гамбит
2. Шатун
Фантастика:
боевая фантастика
7.43
рейтинг книги
Полковник Империи
3. Безумный Макс
Фантастика:
альтернативная история
6.58
рейтинг книги
Смерть может танцевать 3
3. Безликий
Фантастика:
боевая фантастика
5.40
рейтинг книги
АН (цикл 11 книг)
Аномальный наследник
Фантастика:
фэнтези
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Сердце дракона. Том 18. Часть 2
18. Сердце дракона
Фантастика:
героическая фантастика
боевая фантастика
6.40
рейтинг книги
Боги, пиво и дурак. Том 4
4. Боги, пиво и дурак
Фантастика:
фэнтези
героическая фантастика
попаданцы
5.00
рейтинг книги
Старатель 3
3. Старатели
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Измена. Свадьба дракона
Любовные романы:
любовно-фантастические романы
эро литература
5.00
рейтинг книги
Попаданка в деле, или Ваш любимый доктор - 2
2. Попаданка в деле, или Ваш любимый доктор
Любовные романы:
любовно-фантастические романы
7.43
рейтинг книги
Последний Паладин. Том 2
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ты нас предал
1. Измены. Кантемировы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Газлайтер. Том 2
2. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00