0

我想在这篇文章的开头说明我在长期使用 Java 之后对 C#、.NET Core 和 Blazor 非常陌生。

我正在关注 Microsoft 关于Make HTTP requests using IHttpClientFactory in ASP.NET Core的文档,但我似乎无法理解如何在我的应用程序中使用它。

我有一个 API 端点的 IP 地址,所以我创建了一个命名客户端:

services.AddHttpClient("TheAPIEndpoint", client =>
{
    client.BaseAddress = new Uri("192.168.1.234");
    client.DefaultRequestHeaders.Add("Accept", "application/json");
    client.DefaultRequestHeaders.Add("User-Agent", "Skynet v1.0");
});

接下来,我转到页面顶部文档的“基本用法”部分,其中显示:

可以使用依赖注入 (DI) 请求 IHttpClientFactory。以下代码使用 IHttpClientFactory 创建一个 HttpClient 实例

它说要为我的类创建一个构造函数并传入一个 IHttpClientFactory:

public class BasicUsageModel : PageModel
{
    private readonly IHttpClientFactory _clientFactory;

    public BasicUsageModel(IHttpClientFactory clientFactory)
    {
        _clientFactory = clientFactory;
    }

    public async Task OnGet()
    {
        var client = _clientFactory.CreateClient();
    }
}

这是我的问题“开始”的地方。为 Blazor 应用程序创建新的 Razor 组件时,生成的 .RAZOR 文件如下所示:

<h3>HelloWorld</h3>

@code {

}

当我需要调用 API 时,我需要创建这个方法:

private async Task GetSearchResults()
{
    // ...
}

总之,它看起来像这样:

<h3>HelloWorld</h3>
@if (fetchedResults != null)
{
    @foreach (var result in fetchedResults)
    {
        <p>@(result.someData)</p>
    }
}

@code {
    private async Task GetSearchResults()
    {
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri(@"http://192.168.1.234:8082/");
        // ...
        fetchedResults = JsonConvert.DeserializeObject<ResultSet>(response);
    }
}

如您所见,我没有一个“正常”的类结构来创建构造函数,向其传递IHttpClientFactory参数,我可以使用它创建一个新的 HttpClient。

那么,我该怎么做呢?

4

1 回答 1

3

Blazor 不支持您已经发现的构造函数,而是提供了@inject支持依赖注入的指令。语法是:

@inject <dependency-type-name> <variable-name>

在你的情况下:

@inject IHttpClientFactory _clientFactory
<h3>HelloWorld</h3>
@if (fetchedResults != null)
{
    @foreach (var result in fetchedResults)
    {
        <p>@(result.someData)</p>
    }
}

@code {
    private async Task GetSearchResults()
    {
        var client = _clientFactory.CreateClient();
        client.BaseAddress = new Uri(@"http://192.168.1.234:8082/");
        // ...
        fetchedResults = JsonConvert.DeserializeObject<ResultSet>(response);
    }
}

不要忘记在Startup.ConfigureServices方法中注册您的依赖项!

于 2021-03-04T21:06:00.240 回答