DI с функциями Lamdba - PullRequest
       71

DI с функциями Lamdba

0 голосов
/ 23 сентября 2019

У меня есть лямбда-функция (в AWS, но должна быть аналогична функциям Azure).Сценарий, который у меня есть, заключается в том, что некоторые классы зависят от конкретного экземпляра (то есть содержат данные, специфичные для вызова).

Поэтому я попробовал следующие подходы.

Подход 1:

Это то, с чего я начал, и это работает.

private Container container;
void FunctionHandler(params)
{
    InitializeDI()
}

void InitializeDI()
{

    container = new Container();
    //Register all types
    ...
//This is a class that contains some instance specific data, so the same instance is being passed around.
var logg = FileLogger();
    logg.session = SessionData;
    container.RegisterInstance<ILogger>(logg);
}

Я использую конструктор инъекций, и все работает отлично.Единственная проблема, которую я вижу, заключается в том, что граф контейнера перестраивается каждый раз, когда вызывается моя лямбда-функция.

Подход 2:

private static Container container;
void FunctionHandler(params)
{
    InitializeDI()
}

void InitializeDI()
{
    if (container == null)
    {
        container = new Container();
        //Register all types
        ...
    }

    //This is a class that contains some instance specific data, so the same instance is being passed around.
    var logg = FileLogger();
    logg.session = SessionData;
    container.RegisterInstance<ILogger>(logg);
}

Здесь контейнер статичен и будет создан только при первомвызывается функция (т. е. Lambda запускается в холодном режиме), а затем среда повторно использует загруженный класс, поэтому контейнер уже должен быть доступен.Единственная проблема заключается в том, что при поступлении второго вызова ILogger уже будет зарегистрирован на графике и больше не будет регистрироваться.Таким образом, этот подход не работает вообще.

Подход 2.1

void InitializeDI()
{
    if (container == null)
    {
        container = new Container();
        //Register all types
        ...
    }
    var logg = FileLogger();
    container.RegisterInstance<ILogger>(logg);
}
//This is a class that contains some instance specific data, so the same instance is being passed around.
logg.session = SessionData;
}

Я думал просто зарегистрировать его один раз, но изменить данные сеанса только при повторном использовании, но затем функции можно повторновходящий, что означает, что другая функция может получить неправильные данные сеанса ??

Есть ли способ обойти необходимость повторного построения графа объекта каждый раз, но при этом все еще есть работа по внедрению класса, специфичного для вызова?

Спасибо

...