Я создал пустой лямбда-проект AWS с .net CORE:
, который в основном дает пустую лямбду .net coreПроект функции:
Но как и сейчас - он не поддерживает Injection (DI), так как нет файла startup
и т. д...Таким образом, это основной проект .net без всех его преимуществ.
Однако , Тони написал об этом: Add .NET Core DI and Config Goodness to AWS Lambda Functions
":
По сути, он вручную настроил DI для поддержки проекта.
Итак, я создал класс ConfigurationService
:
ConfigureServices.cs
public interface IConfigurationService
{
IConfiguration GetConfiguration();
}
public class ConfigurationService : IConfigurationService
{
public IConfiguration GetConfiguration()
{
return new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
}
}
А затем использовал его в коде, как обычным образом.
Так что здесь та же функция, что и выше, возвращающая ключ из appSettigs, PLUS (!!!) Внедрение зависимости:
Function.cs
public class Function
{
public Function()
{
/*MANUALLY MAKING OUR PROJECT TO SUPPORT DI*/
var serviceCollection = new ServiceCollection();
ConfigureServices(serviceCollection);
var serviceProvider = serviceCollection.BuildServiceProvider();
ConfigService = serviceProvider.GetService<IConfigurationService>();
}
public IConfigurationService ConfigService { get; }
private void ConfigureServices(IServiceCollection serviceCollection)
{
serviceCollection.AddOptions();
serviceCollection.AddTransient<IConfigurationService, ConfigurationService>();
}
public string FunctionHandler(string input, ILambdaContext context)
{
var res = ConfigService.GetConfiguration()["Message"];
return res;
}
}
Работает:
(Здесьэто файл appsetting.json):
appsettings.json
{
"Message": "Hello"
}
Это также работает, когда я вставляю IConfigurationService
в конструктор другого класса.
Так в чем же проблема?
Я хочу использовать безопасный тип доступа к appsettings.json, используя IOptions
.
- поэтому я создал соответствующий файл:
AppSettings.cs
public class AppSettings
{
public string Message { get; set; }
}
А теперь мне нужно configure
это, но посмотрим, что произойдет:
Сначала он вызываетсяConfigureServices
метод в строке # 16, затем It Configure
AppSettings
в строке # 27, а затем происходит сбой (!) в строке # 27, потому что ConfigService
равен null
.Почему это ноль?Потому что он назначается только в строке # 18
Вопрос
Что я должен сделать, чтобы код поддерживал Configure<Appsettings>
?