AWS Lambda с ядром .Net - Включение инъекций для операций ввода-вывода? - PullRequest
0 голосов
/ 21 февраля 2019

Я создал пустой лямбда-проект AWS с .net CORE:

enter image description here

, который в основном дает пустую лямбду .net coreПроект функции:

enter image description here

Но как и сейчас - он не поддерживает 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;
        }
    }

Работает:

enter image description here

(Здесьэто файл appsetting.json):

appsettings.json

{
    "Message": "Hello"
}

Это также работает, когда я вставляю IConfigurationService в конструктор другого класса.

Так в чем же проблема?

Я хочу использовать безопасный тип доступа к appsettings.json, используя IOptions.
- поэтому я создал соответствующий файл:

AppSettings.cs

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

А теперь мне нужно configure это, но посмотрим, что произойдет:

enter image description here

Сначала он вызываетсяConfigureServices метод в строке # 16, затем It Configure AppSettings в строке # 27, а затем происходит сбой (!) в строке # 27, потому что ConfigService равен null.Почему это ноль?Потому что он назначается только в строке # 18

Вопрос

Что я должен сделать, чтобы код поддерживал Configure<Appsettings>?

1 Ответ

0 голосов
/ 21 февраля 2019

На самом деле вам не нужно IOptions в этом сценарии, и вы можете настроить зависимости при необходимости

Например, просмотрите следующее

public class Function {
    public static Func<IServiceProvider> ConfigureServices = () => {
        var serviceCollection = new ServiceCollection();

        serviceCollection.AddOptions(); //OPTIONAL

        //...add additional services as needed

        //building configuration
        var configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddEnvironmentVariables()
            .Build();

        //Get strongly typed setting from appsettings binding to object graph
        var settings = configuration.Get<AppSettings>();
        // adding to service collection so that it can be resolved/injected as needed.
        serviceCollection.AddSingleton(settings);

        return serviceCollection.BuildServiceProvider();
    }

    static IServiceProvider services;

    static Function() { //Static ctor invokes once.
        services = ConfigureServices();
    }

    public string FunctionHandler(string input, ILambdaContext context) {
        //...

        var settings =  services.GetRequiredService<AppSettings>();
        var message = settings.Message;
        return message;
    }
}

Однократная настройка статического поставщика услуг:настроены с желаемыми настройками, добавленными к провайдеру как строго типизированная модель, которую можно при необходимости разрешать и вводить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...