我有 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
}