Чтение онлайн

на главную - закладки

Жанры

Язык программирования 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")]

Поделиться:
Популярные книги

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8

Измена. Отбор для предателя

Лаврова Алиса
1. Отбор для предателя
Фантастика:
фэнтези
5.00
рейтинг книги
Измена. Отбор для предателя

Кодекс Крови. Книга II

Борзых М.
2. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга II

Шаг в бездну

Муравьёв Константин Николаевич
3. Перешагнуть пропасть
Фантастика:
фэнтези
космическая фантастика
7.89
рейтинг книги
Шаг в бездну

Часовая битва

Щерба Наталья Васильевна
6. Часодеи
Детские:
детская фантастика
9.38
рейтинг книги
Часовая битва

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Хроники странного королевства. Вторжение. (Дилогия)

Панкеева Оксана Петровна
110. В одном томе
Фантастика:
фэнтези
9.38
рейтинг книги
Хроники странного королевства. Вторжение. (Дилогия)

Часовой ключ

Щерба Наталья Васильевна
1. Часодеи
Фантастика:
фэнтези
9.36
рейтинг книги
Часовой ключ

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Очешуеть! Я - жена дракона?!

Амеличева Елена
Фантастика:
юмористическая фантастика
5.43
рейтинг книги
Очешуеть! Я - жена дракона?!

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9