Я пытаюсь получить функцию, в которую вставлены зависимости, как указано в документации, Использовать внедрение зависимостей в .NET Azure Functions . Мой класс запуска определяется как:
using System.Runtime.CompilerServices;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
[assembly: FunctionsStartup(typeof(MyFunctions.Startup))]
namespace MyFunctions{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddHttpClient();
}
}
}
Я установил точку останова в операторе builder.Services.AddHttpClient()
, чтобы убедиться, что DI настроен.
Затем я определяю свою функцию, используя HttpTrigger
:
using System;
using System.Net.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
namespace MyFunctions
{
public class ChangeProducer
{
private readonly HttpClient _httpClient;
public ChangeProducer(IHttpClientFactory httpClientFactory)
{
_httpClient = httpClientFactory.CreateClient();
}
[FunctionName("ChangeProducer")]
public void Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "Reservation")]HttpRequest request, ILogger log)
{
Console.WriteLine("foo");
}
}
}
Когда я запускаю это из Visual Studio, я достигаю точки останова в Startup.Configure
. Замечательно!
Затем я меняю свою функцию, чтобы использовать EventGridTrigger
:
using System;
using System.Net.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
namespace MyFunctions
{
public class ChangeProducer
{
private readonly HttpClient _httpClient;
public ChangeProducer(IHttpClientFactory httpClientFactory)
{
_httpClient = httpClientFactory.CreateClient();
}
[FunctionName("ChangeProducer")]
public void Run([EventGridTrigger]EventGridEvent eventGridEvent, ILogger log)
{
Console.WriteLine("foo");
}
}
}
Как только это изменение будет сделано, и никаких других изменений, я не достигну точки останова в Startup.Configure
. Кроме того, я знаю, что DI не работает, потому что, когда я пытаюсь вызвать функцию, я получаю сообщение об ошибке, которое гласит:
Executed 'ChangeProducer' (Failed, Id=06ae8b88-07c4-4150-91e5-8b88400aed72)
Microsoft.Extensions.DependencyInjection.Abstractions: Unable to resolve service for type 'System.Net.Http.IHttpClientFactory' while attempting to activate 'MyFunctions.ChangeProducer'.
Есть ли известная проблема? Я не могу понять это. Разница лишь в типе триггера.
Обновление 2019-06-24 - это просто внедрение зависимостей
Я хочу пояснить, что проблема заключается в том, что внедрение зависимостей не работает, нет проблемы с EventGridTrigger
, когда зависимость от HttpClient
не внедрена. Измените конструктор на следующий, и функция будет работать нормально при срабатывании EventGridTrigger
:
public ChangeProducer()
{
_httpClient = new HttpClient();
}