MassTransit - non-scoped 发布过滤器
MassTransit - non-scoped publish fiters
我创建了一个 Masstransit 发布过滤器,它根据访问者提供的信息创建了一条消息 header。
我想在处理期间在访问器中设置一些值,这些值将由发布过滤器选取。
我对过滤器的理解是,它们是有范围的,因此,发布的任何消息都会创建一个新的 DI 范围。这意味着我在发布消息之前设置的值在过滤器中将不可用。
public interface IAccessor
{
Guid Id {get;set;}
}
public class Accessor : IAccessor
{
public Guid Id {get;set;}
}
public class MyPublishFilter<T> : IFilter<PublishContext<T>> where T : class
{
private readonly IAccessor accessor;
public MyPublishFilter(IAccessor accessor)
=> this.accessor = accessor; <-- this accessor is different to the one in MyProgram
public async Task Send(PublishContext<T> context, IPipe<PublishContext<T>> next)
{
context.CorrelationId = accessor.Id;
await next.Send(context);
}
public class MyProgram
{
public MyProgram(IAccessor accessor) => this.accessor = accessor;
public async Task DoThing()
{
accessor.Id = Guid.NewGuid(); <--- this value is not passed to the filter
messageBus.Publish(new Message());
}
}
有没有办法告诉 MassTransit 不要为消息过滤器创建新范围?
要使用现有范围,请使用 IPublishEndpoint
而不是 IBus
来发布消息。您应该从容器作用域服务提供者那里解析 IPublishEndpoint
,作用域过滤器应该使用相同的作用域。
await using var scope = provider.CreateScope();
// use the scope to set your accessor Id
var publishEndpoint = scope.ServiceProvider.GetRequiredService<IPublishEndpoint>();
await publishEndpoint.Publish(...);
我创建了一个 Masstransit 发布过滤器,它根据访问者提供的信息创建了一条消息 header。
我想在处理期间在访问器中设置一些值,这些值将由发布过滤器选取。
我对过滤器的理解是,它们是有范围的,因此,发布的任何消息都会创建一个新的 DI 范围。这意味着我在发布消息之前设置的值在过滤器中将不可用。
public interface IAccessor
{
Guid Id {get;set;}
}
public class Accessor : IAccessor
{
public Guid Id {get;set;}
}
public class MyPublishFilter<T> : IFilter<PublishContext<T>> where T : class
{
private readonly IAccessor accessor;
public MyPublishFilter(IAccessor accessor)
=> this.accessor = accessor; <-- this accessor is different to the one in MyProgram
public async Task Send(PublishContext<T> context, IPipe<PublishContext<T>> next)
{
context.CorrelationId = accessor.Id;
await next.Send(context);
}
public class MyProgram
{
public MyProgram(IAccessor accessor) => this.accessor = accessor;
public async Task DoThing()
{
accessor.Id = Guid.NewGuid(); <--- this value is not passed to the filter
messageBus.Publish(new Message());
}
}
有没有办法告诉 MassTransit 不要为消息过滤器创建新范围?
要使用现有范围,请使用 IPublishEndpoint
而不是 IBus
来发布消息。您应该从容器作用域服务提供者那里解析 IPublishEndpoint
,作用域过滤器应该使用相同的作用域。
await using var scope = provider.CreateScope();
// use the scope to set your accessor Id
var publishEndpoint = scope.ServiceProvider.GetRequiredService<IPublishEndpoint>();
await publishEndpoint.Publish(...);