【发布时间】:2019-01-23 03:19:50
【问题描述】:
我正在尝试使用需要改装客户端的 masstransit 运行 saga,并且我希望将客户端依赖项注入到 saga 中。
我使用 MassTransit 5.2.3 和 MassTransit.Extensions.DependencyInjection 5.2.3 进行如下设置:
...
var serviceCollection = new ServiceCollection();
serviceCollection.AddRefitClient<IClient>(...).ConfigureHttpClient(...);
serviceCollection.AddMassTransit(c =>
{
c.AddSaga<MySaga>();
});
serviceCollection.AddScoped<MySaga>();
serviceCollection.AddSingleton<ISagaRepository<MySaga>, MessageSessionSagaRepository<MySaga>>(x => new MessageSessionSagaRepository<MySaga>());
var serviceProvider = serviceCollection.BuildServiceProvider();
var bus = Bus.Factory.CreateUsingAzureServiceBus(cfg =>
{
var host = ...;
...
cfg.ReceiveEndpoint(host, "MyQueue", e =>
{
...
e.Saga<MySaga>(serviceProvider);
});
});
bus.Start();
...
传奇的代码是:
class MySaga :
ISaga,
InitiatedBy<IStep1>,
Orchestrates<IStep2>
{
private readonly IClient _client;
public Guid CorrelationId { get; set; }
public MySaga(IClient client)
{
_client = client;
}
public async Task Consume(ConsumeContext<IStep1> context) {...}
public async Task Consume(ConsumeContext<IStep2> context) {...}
}
这会导致“无法为 MyNamespace.MySaga 创建 saga 连接器”异常,内部异常“ConfigurationException:saga MyNamespace.MySaga 必须具有默认构造函数和可写 CorrelationId 属性或具有单个 Guid 参数的构造函数分配 CorrelationId"
【问题讨论】:
-
Alexey 在构造函数上是对的,如果你需要在你的消费方法中使用服务,你可以使用 consumeContext.GetPayload
().GetRequiredService(...) 来解决它们。由于您已经在使用 .Saga(serviceProvider) 重载,因此应该注册适当的范围提供程序。
标签: dependency-injection .net-core masstransit