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

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

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);

Поделиться с друзьями: