带有.Net核心的AWS Lambda-是否为IOptions注入?

时间:2019-02-20 22:35:14

标签: c# amazon-web-services .net-core aws-lambda

我已经使用.net CORE创建了一个空的AWS Lambda项目:

enter image description here

基本上它产生的只是一个.net核心空lambda函数项目:

enter image description here

但是现在-它不支持Injection(DI),因为没有startup文件等...因此,基本上,它是.net核心项目,没有所有好处。

However , Tony wrote about it: 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返回键,加上(!!!)依赖注入:

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;
        }
    }

它确实有效:

enter image description here

(这是appsetting.json文件BTW):

appsettings.json

{
    "Message": "Hello"
}

当我将IConfigurationService注入到其他类的构造函数中时,它也起作用。

那么问题出在哪里呢?

我想使用IOptions使用对appsettings.json的类型安全访问。
—因此,我创建了一个相应的文件:

AppSettings.cs

 public class AppSettings
    {
        public string Message  { get; set; }
    }

现在我需要configure,但是看看会发生什么:

enter image description here

它首先在第16行中调用ConfigureServices方法,然后在第27行中Configure AppSettings,然后由于{{ 1}}是ConfigService。 为什么它为null?因为它仅在第18行

中分配

问题

我应该怎么做才能使代码支持null

1 个答案:

答案 0 :(得分:3)

在这种情况下,您实际上并不需要QuestionId,并且可以根据需要配置依赖项

例如查看以下内容

IOptions

静态服务提供商的一次性设置已配置为所需的设置,该设置是作为强类型模型添加到提供商的,可以根据需要进行解析和注入。