TGStat
TGStat
Type to search
Advanced channel search
  • flag English
    Site language
    flag Russian flag English flag Uzbek
  • Sign In
  • Catalog
    Channels and groups catalog Regional compilations Thematic compilations Платные каналы Search for channels
    Add a channel/group
  • Ratings
    Rating of channels Rating of groups Posts rating
    Ratings of brands and people
  • Analytics
  • Search by posts
  • Telegram monitoring
  • Promotion
    Advertising through Yandex Business Advertising in channels through TGStat Agency Advertising on TGStat.ru website
async / noway — Будни разработчика

4 May, 18:06

Open in Telegram Share Report

Ну и давайте еще по теме контроллера подсвечу, какие есть нюансы при работе с моделями и контроллерами в нашем .NET.

Многие, наверное, знают про три ключевые вещи, которые делают из любого класса контроллер - это наследование от класса ControllerBase, имя класса, заканчивающееся на Controller, и использование атрибута [ApiController]

Но что, если я Вам скажу, что ни один из этих моментов не является обязательным. С именем все просто, при старте приложения фреймворк просто собирает все классы по соглашению с таким названием и пытается именно из них зарегистрировать контроллер. Собственно, вы можете любой класс явно указать, что его стоит рассмотреть как контроллер, повесив атрибут [Controller].

ControllerBase - использование этого класса встречается во всех книгах, гайдах и туториалах, да и в реальных приложениях тоже. Но, что интересно, он тоже не является обязательным. Да, он сильно упрощает жизнь за счет доступа к контексту и использованиие готовых реализаций IActionResult типа Ok(), NotFound(), BadRequest() и т.д. Но вы можете его и не наследовать, а просто добавить свойство в свой класс
[ControllerContext]
public ControllerContext Context { get; set; }

И все, вы можете снова использовать контекст в привычном виде
if (!Context.ModelState.IsValid)
{ return new BadRequestObjectResult(Context.ModelState); }


Тогда, наверное [ApiController] является обязательным? Нет, и он тоже не является обязательным. Также как и с прошлым примером, использование данного атрибута упрощает процесс, например за счет автоматической валидации модели. Если вы где-то видите внутри контроллера if (!ModelState.IsValid)
То там скорее всего как раз отказались от автоматической валидации (об этом планирую отдельно написать, если интересно будет) Ну и дополнительно это умный биндинг (долой [FromBody] или [FromQuery]), ну и кое что другое. В итоге, полноценный работающий контроллер может выглядеть так
[Controller]
[Route("api/hello")]
public class MySimpleHandler
{
[HttpGet]
public string SayHello() => "Hello, World!";
}
async / noway — Будни разработчика
Давненько ничего не писал про программирование, время исправиться. В нашем любимом .NET очень часто на собесах любят спрашивать про типы данных, про ссылочные и значимые, где большинство отвечает уже на автомате про хранение на стеке / кучи, передача значения или ссылки на значение, боксинг / анбокс...

149 0 1 5
Catalog
Channels and groups catalog Channels compilations Search for channels Add a channel/group
Ratings
Rating of Telegram channels Rating of Telegram groups Posts rating Ratings of brands and people
API
API statistics Search API of posts API Callback
Our channels
@TGStat @TGStat_Chat @telepulse @TGStatAPI
Read
Академия TGStat Telegram Research 2019 Telegram Research 2021 Telegram Research 2023
Contacts
Справочный центр Support Email Jobs
Miscellaneous
Terms and conditions Privacy policy Public offer
Our bots
@TGStat_Bot @SearcheeBot @TGAlertsBot @tg_analytics_bot @TGStatChatBot