#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. Ваш вопрос не содержит информации об используемой платформе обмена сообщениями. То, как обернуть область действия вашего контейнера и разрешить обработчик сообщений, сильно зависит от точек перехвата, которые предоставляет используемая платформа обмена сообщениями.