Внедрение зависимостей в функции AWS Lambda с использованием ядра dotnet 2.1 - PullRequest
0 голосов
/ 30 сентября 2018

Я новичок в Aws Lambda и пытаюсь понять, как использовать Dependency Injection в Aws Lambda с помощью .net core 2.1.

Я пытаюсь ввести IHttpClientFactory, но я не уверен, чтоя делаю это правильно.

Я вызываю метод ниже в конструкторе класса лямбда-функции:

  private static IServiceProvider ConfigureServices()
    {
        var serviceCollection = new ServiceCollection();
        serviceCollection.AddHttpClient("client", client =>
        {
            client.BaseAddress = new Uri("someurl");
        });

       return serviceCollection.BuildServiceProvider();
    }

Это правильно?

Кроме того, после того, как он возвращает IServiceProvider, как я могу использовать его в любом классе, где мне нужно вызвать IHttpClientFactory?

(я просмотрел некоторые связанные статьи, но мне все еще неясно использовать метод вывода ConfigureServices(), когдавызывается в конструкторе?)

Спасибо.

Пример использования для DI:

public class Function
{
   private readonly ITestClass _test;
   public Function()
    {
       ConfigureServices();
    }

    public async Task Handler(ILambdaContext context)
    {
       _test.Run(); //Run method from TestClass that implements ITestClass and calls IHttpClientFactory to make call to an API

      //return something
    }

    private static void ConfigureServices()
    {
        var serviceCollection = new ServiceCollection();
        serviceCollection.AddHttpClient("client", client =>
        {
            client.BaseAddress = new Uri("someurl");
        });
       serviceCollection.AddTransient<ITestClass, TestClass>();
       serviceCollection.BuildServiceProvider(); //is it needed??
    }
}

1 Ответ

0 голосов
/ 30 сентября 2018

Назначьте поставщика услуг в качестве контейнера DI и используйте его в своих функциях

Function.cs

public class Function {

    public static Func<IServiceProvider> ConfigureServices = () => {
        var serviceCollection = new ServiceCollection();
        serviceCollection.AddHttpClient("client", client =>
        {
            client.BaseAddress = new Uri("someurl");
        });
        serviceCollection.AddTransient<ITestClass, TestClass>();
        return serviceCollection.BuildServiceProvider();
    };

    static IServiceProvider services;
    static Function() {
        services = ConfigureServices();
    }


    public async Task Handler(ILambdaContext context) {
        ITestClass test = services.GetService<ITestClass>();
        await test.RunAsync(); 

        //...
    }
}

Использование статического конструктора для одноразового вызованастроить свои сервисы и построить сервисный контейнер.

...