Вызов методов класса с внедрением зависимостей C# net Core 6.0 ⇐ C#
-
Гость
Вызов методов класса с внедрением зависимостей C# net Core 6.0
У меня есть контроллер на C#, который вызывает класс, который, в свою очередь, отправляет HTTP-запросы и возвращает ответ в соответствии с приведенной ниже последовательностью кода:
Я добавил следующую строку в Program.cs
builder.Services.AddHttpClient(); Я создал класс, который получает вызов контроллера и отправляет HTTP-запрос на внешний веб-сайт.
Пользователи публичного класса { общедоступная асинхронная задача GetUsers(HttpClient _httpClient) { var request = new HttpRequestMessage(new HttpMethod("get"), "https://gorest.co.in/public/v2/users"); вар res = ждут _httpClient.SendAsync(запрос); var content = ждут res.Content.ReadAsStringAsync(); возврат контента; } } Я создал контроллер для получения моих HTTP-запросов, и этот контроллер создает экземпляр клиента через IHttpClientFactory, чтобы избежать исчерпания HTTP-сокетов...
[Route("api/[controller]")] общедоступный класс UsersController: ControllerBase { частный только для чтения IHttpClientFactory _client; общедоступный UsersController (клиент IHttpClientFactory) { _клиент = клиент; } общедоступный класс UsersModel { общественный ИНТ идентификатор {получить; набор; } имя публичной строки {get; набор; } публичная строка электронная почта {get; набор; } публичная строка пол { get; набор; } статус публичной строки {get; набор; } } [HttpGet("GetUsers")] общедоступная асинхронная задача GetUsers() { вар myClient = _client.CreateClient(); return Newtonsoft.Json.JsonConvert.DeserializeObject(ожидайте новых пользователей().GetUsers(myClient)); } } Хорошо, приведенная выше последовательность кода выполняет свою работу правильно, но есть одна вещь, которая меня очень беспокоит: внедрение зависимостей и создание HTTP-клиента в каждом контроллере, который вызывает этот класс.
Я хотел бы создать класс, который принимает вызов контроллера, но этот класс сам создает свой HTTP-клиент, без необходимости его передачи контроллером в качестве параметра... Я попробовал что-то вроде кодов ниже:
Я изменил свой контроллер, чтобы он больше не имел внедрения зависимостей, а просто вызывал класс.
[Route("api/[controller]")] общедоступный класс UsersController: ControllerBase { общедоступный класс UsersModel { общественный ИНТ идентификатор {получить; набор; } имя публичной строки {get; набор; } публичная строка электронная почта {get; набор; } публичная строка пол { get; набор; } статус публичной строки {get; набор; } } [HttpGet("GetUsers")] общедоступная асинхронная задача GetUsers() { return Newtonsoft.Json.JsonConvert.DeserializeObject(ожидайте новых пользователей().GetUsers()); } } Класс, в свою очередь, будет отвечать за создание HTTP-клиента.
Пользователи публичного класса { частный только для чтения IHttpClientFactory _client; общедоступные пользователи (клиент IHttpClientFactory) { _клиент = клиент; } публичная асинхронная задача GetUsers() { вар _httpClient = _client.CreateClient(); var request = new HttpRequestMessage(new HttpMethod("get"), "https://gorest.co.in/public/v2/users"); вар res = ждут _httpClient.SendAsync(запрос); var content = ждут res.Content.ReadAsStringAsync(); возврат контента; } } Но когда мой контроллер выдает следующую ошибку, когда я пытаюсь это сделать: не указан аргумент, соответствующий требуемому параметру...
Я видел, как некоторые люди говорили, что им нужно реализовать конструктор, вставить :base()... но признаюсь, что я не на достаточном уровне, чтобы решить эту проблему самостоятельно. Буду очень признателен, если кто-нибудь поможет мне с этой задачей.
У меня есть контроллер на C#, который вызывает класс, который, в свою очередь, отправляет HTTP-запросы и возвращает ответ в соответствии с приведенной ниже последовательностью кода:
Я добавил следующую строку в Program.cs
builder.Services.AddHttpClient(); Я создал класс, который получает вызов контроллера и отправляет HTTP-запрос на внешний веб-сайт.
Пользователи публичного класса { общедоступная асинхронная задача GetUsers(HttpClient _httpClient) { var request = new HttpRequestMessage(new HttpMethod("get"), "https://gorest.co.in/public/v2/users"); вар res = ждут _httpClient.SendAsync(запрос); var content = ждут res.Content.ReadAsStringAsync(); возврат контента; } } Я создал контроллер для получения моих HTTP-запросов, и этот контроллер создает экземпляр клиента через IHttpClientFactory, чтобы избежать исчерпания HTTP-сокетов...
[Route("api/[controller]")] общедоступный класс UsersController: ControllerBase { частный только для чтения IHttpClientFactory _client; общедоступный UsersController (клиент IHttpClientFactory) { _клиент = клиент; } общедоступный класс UsersModel { общественный ИНТ идентификатор {получить; набор; } имя публичной строки {get; набор; } публичная строка электронная почта {get; набор; } публичная строка пол { get; набор; } статус публичной строки {get; набор; } } [HttpGet("GetUsers")] общедоступная асинхронная задача GetUsers() { вар myClient = _client.CreateClient(); return Newtonsoft.Json.JsonConvert.DeserializeObject(ожидайте новых пользователей().GetUsers(myClient)); } } Хорошо, приведенная выше последовательность кода выполняет свою работу правильно, но есть одна вещь, которая меня очень беспокоит: внедрение зависимостей и создание HTTP-клиента в каждом контроллере, который вызывает этот класс.
Я хотел бы создать класс, который принимает вызов контроллера, но этот класс сам создает свой HTTP-клиент, без необходимости его передачи контроллером в качестве параметра... Я попробовал что-то вроде кодов ниже:
Я изменил свой контроллер, чтобы он больше не имел внедрения зависимостей, а просто вызывал класс.
[Route("api/[controller]")] общедоступный класс UsersController: ControllerBase { общедоступный класс UsersModel { общественный ИНТ идентификатор {получить; набор; } имя публичной строки {get; набор; } публичная строка электронная почта {get; набор; } публичная строка пол { get; набор; } статус публичной строки {get; набор; } } [HttpGet("GetUsers")] общедоступная асинхронная задача GetUsers() { return Newtonsoft.Json.JsonConvert.DeserializeObject(ожидайте новых пользователей().GetUsers()); } } Класс, в свою очередь, будет отвечать за создание HTTP-клиента.
Пользователи публичного класса { частный только для чтения IHttpClientFactory _client; общедоступные пользователи (клиент IHttpClientFactory) { _клиент = клиент; } публичная асинхронная задача GetUsers() { вар _httpClient = _client.CreateClient(); var request = new HttpRequestMessage(new HttpMethod("get"), "https://gorest.co.in/public/v2/users"); вар res = ждут _httpClient.SendAsync(запрос); var content = ждут res.Content.ReadAsStringAsync(); возврат контента; } } Но когда мой контроллер выдает следующую ошибку, когда я пытаюсь это сделать: не указан аргумент, соответствующий требуемому параметру...
Я видел, как некоторые люди говорили, что им нужно реализовать конструктор, вставить :base()... но признаюсь, что я не на достаточном уровне, чтобы решить эту проблему самостоятельно. Буду очень признателен, если кто-нибудь поможет мне с этой задачей.
Мобильная версия