Я новичок в 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??
}
}
Назначьте поставщика услуг как контейнер 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();
//...
}
}
Использование статического конструктора для одноразового вызова для настройки ваших сервисов и создания контейнера службы.
ConfigureServices
общедоступными и переопределенными, преобразовав его в Func<IServiceProvider>
чтобы его можно было заменить при тестировании.