Azure 函数中具有依赖项注入的 HttpClient

Ole*_*ukh 1 c# .net-core azure-functions

文档说使用 builder.Services.AddHttpClient()HttpClient 进行注册,但我可以在没有这个的情况下解析 HttpClient。

我有一家小型初创公司,只注册 MyService :

public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddTransient<MyService>();
    }
}
Run Code Online (Sandbox Code Playgroud)

在函数中,我想解析 HttpClient 和 MyService 并且此代码有效。

public class Function
{
    public Function(MyService service, HttpClient client)
    {
    }

    [FunctionName("func")]
    public async Task<IActionResult> Update(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)]
        HttpRequest request,
        ILogger logger)
    {
        return new OkObjectResult("Hello");
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 谁在哪里注册 HttpClient?
  • 我应该使用吗builder.Services.AddHttpClient()?这不是多余的吗?

Ste*_*dis 6

你是对的。您首先需要向其注册服务:

public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        //Register HttpClientFactory
        builder.Services.AddHttpClient();

        builder.Services.AddTransient<MyService>();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您的服务将使用 HttpClientFactory,那么在服务之前注册很重要。因此,当 MyService 实例依赖性得到解决时,DI 容器中已经有 HttpCliendFactory 的记录。

您的 Function.cs 类将是:

public class Function
{
    private IHttpClientFactory _httpClientFactory;
    private MyService _myService;


    public Function(MyService myService, IHttpClientFactory client)
    {
        _myService = myService;
        _httpClientFactory = httpClientFactory;
    }

    [FunctionName("func")]
    public async Task<IActionResult> Update(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)]
        HttpRequest request,
        ILogger logger)
    {
        //How to use example
        var client = _httpClientFactory.CreateClient();

        return new OkObjectResult("Hello");
    }
}
Run Code Online (Sandbox Code Playgroud)

HttpClient 当然可以在没有客户端工厂的情况下使用,但是如果您从 HttpClientFactory 生成 HttpClient 对象,您将对 HttpClient 资源进行更好的开箱即用管理。