Внедрение зависимостей в функции AWS Lambda с использованием ядра dotnet 2.1

2

Я новичок в Aws Lambda и пытаюсь выяснить, как использовать Injection Dependency в 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??
    }
}
  • 0
    Пока то, что у вас есть, можно использовать. Что касается других ваших вопросов, вам нужно будет показать некоторый код, который поможет продемонстрировать, что именно вы пытаетесь сделать. Покажите пример функции с включенным фрагментом выше.
Теги:
.net-core
aws-lambda
dependency-injection

1 ответ

0

Назначьте поставщика услуг как контейнер 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(); 

        //...
    }
}

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

  • 0
    Благодарю. Может ли Handler () быть проверен модулем путем насмешки ITestClass?
  • 0
    Вам нужно будет сделать ConfigureServices общедоступными и переопределенными, преобразовав его в Func<IServiceProvider> чтобы его можно было заменить при тестировании.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню