LoveRead.info » Книги » Разная литература » Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

177 0 18:04, 26-08-2023
Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
26 август 2023

Книга Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен читать онлайн бесплатно без регистрации

В 10-м издании книги описаны новейшие возможности языка C# 9 и .NET 5 вместе с подробным "закулисным" обсуждением, призванным расширить навыки критического мышления разработчиков, когда речь идет об их ремесле. Книга охватывает ASP.NET Core, Entity Framework Core и многое другое наряду с последними обновлениями унифицированной платформы .NET, начиная с улучшений показателей производительности настольных приложений Windows в .NET 5 и обновления инструментария XAML и заканчивая расширенным рассмотрением файлов данных и способов обработки данных. Все примеры кода были переписаны с учетом возможностей последнего выпуска C# 9.

    1 ... 398 399 400 401 402 403 404 405 406 407
    Перейти на страницу:
    id="id1543">

    Вызов HTTP-метода PUT

    Метод для обновления записи Car использует HTTP-метод PUT. Он применяет вспомогательный метод для отправки записи Car в формате JSON и возвращает обновленную запись Car из тела ответа:

    public async Task<Car> UpdateCarAsync(int id, Car entity)

    {

      var response = await PutAsJson($"{_settings.Uri}{_settings.CarBaseUri}/{id}",

        JsonSerializer.Serialize(entity));

      response.EnsureSuccessStatusCode();

      return await response.Content.ReadFromJsonAsync<Car>();

    }

    Вызов HTTP-метода DELETE

    Последний добавляемый метод предназначен для выполнения НТТР-метода DELETE. Шаблон соответствует остальным методам: использование вспомогательного метода и проверка ответа на предмет успешности. Он ничего не возвращает вызывающему коду, поскольку сущность была удалена. Ниже показан код метода:

    public async Task DeleteCarAsync(int id, Car entity)

    {

      var response = await DeleteAsJson($"{_settings.Uri}{_settings.CarBaseUri}/{id}",

        JsonSerializer.Serialize(entity));

      response.EnsureSuccessStatusCode();

    }

    Конфигурирование служб

    Создайте в каталоге ApiWrapper проекта AutoLot.Service новый файл класса по имени ServiceConfiguration.cs. Приведите операторы using к следующему виду:

    using Microsoft.Extensions.Configuration;

    using Microsoft.Extensions.DependencyInjection;

    Сделайте класс открытым и статическим, после чего добавьте открытый статический расширяющий метод для IServiceCollection:

    namespace AutoLot.Services.ApiWrapper

    {

      public static class ServiceConfiguration

      {

         public static IServiceCollection ConfigureApiServiceWrapper(

             this IServiceCollection services, IConfiguration config)

        {

          return services;

        }

      }

    }

    В первой строке расширяющего метода в контейнер DI добавляется ApiServiceSettings. Во второй строке в контейнер DI добавляется IApiServiceWrapper и регистрируется класс с помощью фабрики HTTPClient. Это позволяет внедрять IApiServiceWrapper в другие классы, а фабрика HTTPClient будет управлять внедрением и временем существования HTTPClient:

    public static IServiceCollection ConfigureApiServiceWrapper(this IServiceCollection

    services, IConfiguration config)

    {

      services.Configure<ApiServiceSettings>(

          config.GetSection(nameof(ApiServiceSettings)));

      services.AddHttpClient<IApiServiceWrapper,ApiServiceWrapper>();

      return services;

    }

    Откройте файл Startup.cs и добавьте следующий оператор using:

    using AutoLot.Services.ApiWrapper;

    Перейдите к методу ConfigureServices() и добавьте в него показанную ниже строку:

    services.ConfigureApiServiceWrapper(Configuration);

    Построение класса CarsController

    Текущая версия CarsController жестко привязана к хранилищам в библиотеке доступа к данным. Следующая итерация CarsController для связи с базой данных будет применять оболочку службы. Переименуйте CarsController в CarsDalController (включая конструктор) и добавьте в каталог Controllers новый класс по имени CarsController. Код этого класса является практически точной копией CarsController, но они хранятся по отдельности с целью прояснения разницы между использованием хранилищ и службы.

    На заметку! При работе с одной и той же базой данных вам редко придется применять вместе уровень доступа к данным и оболочку службы. Здесь показаны оба варианта, чтобы вы смогли решить, какой из них лучше подходит в вашей ситуации.

    Приведите операторы using к следующему виду:

    using System.Threading.Tasks;

    using AutoLot.Dal.Repos.Interfaces;

    using AutoLot.Models.Entities;

    using AutoLot.Services.ApiWrapper;

    using AutoLot.Services.Logging;

    using Microsoft.AspNetCore.Mvc;

    using Microsoft.AspNetCore.Mvc.Rendering;

    Далее сделайте класс открытым, унаследуйте его от Controller и добавьте атрибут Route. Создайте конструктор, который принимает экземпляры реализаций IAutoLotServiceWrapper и IAppLogging, после чего присвойте оба экземпляра переменным уровня класса. Вот начальный код:

    namespace AutoLot.Mvc.Controllers

    {

    [Route("[controller]/[action]")]

    public class CarsController : Controller

    {

      private readonly IApiServiceWrapper _serviceWrapper;

      private readonly IAppLogging<CarsController> _logging;

      public CarsController(IApiServiceWrapper serviceWrapper,

          IAppLogging<CarsController> logging)

      {

        _serviceWrapper = serviceWrapper;

        _logging = logging;

      }

    }

    Вспомогательный метод GetMakes()

    Вспомогательный метод GetMakes() строит экземпляр SelectList со всеми записями Make в базе данных. Он использует Id в качестве значения и Name в качестве отображаемого текста:

    internal async Task<SelectList> GetMakesAsync()=>

      new SelectList(

        await _serviceWrapper.GetMakesAsync(),

        nameof(Make.Id),

        nameof(Make.Name));

    Вспомогательный метод GetOneCar()

    Вспомогательный метод GetOneCar() получает одиночную запись Car:

    internal async Task<Car> GetOneCarAsync(int? id)

      => !id.HasValue ? null : await _serviceWrapper.GetCarAsync(id.Value);

    Открытые методы действий

    Единственное отличие между открытыми методами действий в этом контроллере и аналогичными методами в CarsDalController связано с доступом к данным, а также с тем,что все методы определены как асинхронные. Поскольку вы уже понимаете, для чего предназначено то или иное действие, ниже приведены остальные методы, изменения в которых выделены полужирным:

    [Route("/[controller]")]

    [Route("/[controller]/[action]")]

    public async Task<IActionResult> Index()

      => View(await _serviceWrapper.GetCarsAsync());

    [HttpGet("{makeId}/{makeName}")]

    public async Task<IActionResult> ByMake(int makeId, string makeName)

    {

      ViewBag.MakeName = makeName;

      return View(await _serviceWrapper.GetCarsByMakeAsync(makeId));

    }

    [HttpGet("{id?}")]

    public async Task<IActionResult> Details(int? id)

    {

      if (!id.HasValue)

      {

        return BadRequest();

      }

      var car = await GetOneCarAsync(id);

      if (car == null)

      {

        return NotFound();

      }

      return View(car);

    }

    [HttpGet]

    public async Task<IActionResult> Create()

    {

      ViewData["MakeId"] = await GetMakesAsync();

      return View();

    }

    [HttpPost]

    [ValidateAntiForgeryToken]

    public async Task<IActionResult> Create(Car car)

    {

      if (ModelState.IsValid)

      {

        await _serviceWrapper.AddCarAsync(car);

        return RedirectToAction(nameof(Index));

      }

      ViewData["MakeId"] = await GetMakesAsync();

      return View(car);

    }

    [HttpGet("{id?}")]

    public async Task<IActionResult> Edit(int? id)

    {

      var car = await GetOneCarAsync(id);

      if (car == null)

      {

        return NotFound();

      }

      ViewData["MakeId"] = await GetMakesAsync();

      return View(car);

    }

    [HttpPost("{id}")]

    [ValidateAntiForgeryToken]

    public async Task<IActionResult> Edit(int id, Car car)

    {

      if (id != car.Id)

      {

        return BadRequest();

      }

      if (ModelState.IsValid)

      {

        await _serviceWrapper.UpdateCarAsync(id,car);

        return RedirectToAction(nameof(Index));

      }

      ViewData["MakeId"] = await GetMakesAsync();

      return View(car);

    }

    1 ... 398 399 400 401 402 403 404 405 406 407
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

    Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


    Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

    • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
    • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
    • 3. Просьба отказаться от нецензурной лексики.
    • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

    Надеемся на Ваше понимание и благоразумие. С уважением, администратор LoveRead.info.


    Установить VPN и читай слушай бесплатно

    Новые отзывы

    1. Лариса Лариса04 июнь 12:43 Да, просто до слез похоже на сериал ,,Даррел,,... Смерть в райском уголке - Эмили Салливан
    2. Stmara Stmara02 июнь 22:44 Приятная история, чтобы скоротать вечер. Любимая книга из последних "Любовь со смертью", также очень понравилась -"Суженная... Сердце космического дракона - Ольга Вадимовна Гусейнова
    3. Alex Alex01 июнь 17:12 💩💩💩🖕🖕🖕🖕🖕🖕🖕... Игровой момент II - Александр Андреевич Бодров
    Все комметарии
    Новинки бесплатной онлайн библиотеки