Lightinject — как безопасно начать новую область вне корня композиции?

#c# #dependency-injection #light-inject

#c# #внедрение зависимостей #свет-впрыскивать

Вопрос:

У меня есть служба Windows, принимающая некоторые сообщения. Я использую LightInject для DI. Служба записывает в базу данных через DbContext каждый раз, когда приходит какое-либо сообщение. Таким образом, мне нужно ограничить время жизни DbContext обработкой этого сообщения и утилизировать его после обработки сообщения. Интересно, будет ли правильным создание моей собственной области для каждого сообщения. Но я изо всех сил пытаюсь выяснить, как это сделать чисто.

У меня есть какой-то слушатель, который заставляет обработчик обрабатывать каждое полученное сообщение. И мне нужно создать область для события получения сообщения. Но, как и в существующем экземпляре потребителя, у меня там нет контейнера, на котором я мог бы начать новую область. И я не могу внедрить сам контейнер, так как это плохая практика и просто не работает. Итак, есть ли какой-нибудь способ создать новую область для моего пользовательского события где-нибудь за пределами корня композиции?

Мне нужно что-то вроде этого:

Корень службы:

 serviceRegistry.Register<IMessageConsumer, CreateUserMessageConsumer>(
    new PerContainerLifetime());
serviceRegistry.Register<RequestHandler, UserCreateHandler>(
    new PerScopeLifetime());
serviceRegistry.Register<DbContext, MyDbContext>(
    new PerScopeLifetime());
 

Потребитель:

 CreateUserMessageConsumer(CreateUserHandler handler)
{
    this.handler = handler;
}

public async Listen()
{
    //listening producing message
    ....
    using(container.BeginScope())    //this is the problematic part
    {
        this.handler.Handle(message);
    }       
}
 

Обработчик:

 CreateUserHandler(DbContext context)
{
    this.dbContext = context;
}
    
public void Handle(Message message)
{
    //do some db magic with dbContext
}
 

Комментарии:

1. Создание нового изолированного пузырька (т. Е. Области) Для каждого сообщения — хорошая идея. Это предотвращает возможность влияния сообщений друг на друга в зависимости от общего состояния. Наличие этого общего состояния делает систему действительно сложной для тестирования и проверки.

2. Ваш вопрос не содержит информации об используемой платформе обмена сообщениями. То, как обернуть область действия вашего контейнера и разрешить обработчик сообщений, сильно зависит от точек перехвата, которые предоставляет используемая платформа обмена сообщениями.