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

时间:2020-05-14 15:35:34

标签: c# .net-core azure-functions

Documentation说要使用builder.Services.AddHttpClient()进行注册 HttpClient,但是没有这个我就可以解析HttpClient。

我有一家小型公司,仅注册MyService:

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

在“功能”中,我想解析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");
    }
}
  • 谁在哪里注册HttpClient?
  • 我应该使用builder.Services.AddHttpClient()吗?这不是多余的吗?

1 个答案:

答案 0 :(得分:2)

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

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

        builder.Services.AddTransient<MyService>();
    }
}

如果您的服务将使用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");
    }
}

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