gpt4 book ai didi

c# - MassTransit 和 .NET Core DI - 如何使用无参数构造函数解决依赖关系?

转载 作者:太空狗 更新时间:2023-10-29 18:11:41 28 4
gpt4 key购买 nike

我正在使用 .NET Core 2 和 MassTransit 4(dev) 开发应用。

Mass Transit 需要为消费者提供无参数构造函数。我需要使用例如我的消费者中的 logger、dbContext 等,我想继续使用 .NET Core 中的原生 DI,所以我宁愿不必添加 Autofac 等(如果可能的话?)。当 .NET Core DI 无法注入(inject)我的 deps 时会导致问题,因为我的消费者是使用无参数构造函数创建的...

是否有任何方法可以在具有无参数构造函数的同时使用 native 网络核心 DI 来解决依赖关系,或者是否有某种方法可以声明 MassTransit 的端点,这将允许执行除标准之外的其他操作:

sbc.ReceiveEndpoint(host, Configuration["QueueName"], 
e => { e.Consumer<MyAwesomeConsumer>();});

我试过:

// =========== MASS TRANSIT ===============
var serviceProvider = services.BuildServiceProvider();
services.AddSingleton<MyAwesomeConsumer, MyAwesomeConsumer>();
var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
{
var host = sbc.Host(new Uri("rabbitmq://localhost"), h =>
{
h.Username("guest");
h.Password("guest");
});

sbc.ReceiveEndpoint(host, Configuration["QueueName"],
e =>
{
e.Consumer(typeof(MyAwesomeConsumer), serviceProvider.GetService);
});
});

应用程序启动,但第一条消息一到达我就收到错误:MassTransit.ConsumerException: Unable to resolve consumer type 'AuthService.Integrations.MyAwesomeConsumer'。

我将不胜感激任何帮助。我希望我问的很清楚。

最佳答案

如果您正在使用 Microsoft.Extensions.DependencyInjection 容器(这是 ASP.NET Core 的默认设置),那么您将需要 MassTransit.Extensions.DependencyInjection MassTransit 的包裹。请注意,该软件包目前仅作为预发布版本提供,并且还需要 MassTransit 的预发布版本。此外,新包是 a massive migration for .NET Standard 的一部分。 ,这还没有完成,所以您可能应该多加小心,因为在最终版本发布之前可能会有很多事件部件。

由于该软件包尚未正式发布,因此也没有任何文档。但是从看the pull request that introduced itthe current source ,我认为你需要做的是:

Startup.ConfigureServices 中,您需要添加 MassTransit,就像添加其他服务一样:

services.AddMassTransit(c =>
{
c.AddConsumer<MyConsumer>();
c.AddConsumer<MyOtherConsumer>();

// or sagas
c.AddSaga<MySaga>();
});

// you still need to register the consumers/sagas
services.AddScoped<MyConsumer>();
services.AddScoped<MyOtherConsumer>();
services.AddSingleton<ISagaRepository<MySaga>, InMemorySagaRepository<MySaga>>();

在配置操作中,您需要注册消费者和 sagas,以便 MassTransit 稍后正确解析它们。

然后,在您的总线配置中,您将通过服务提供商调用 LoadFrom:

sbc.ReceiveEndpoint(host, Configuration["QueueName"], e =>
{
e.LoadFrom(serviceProvider);
});

至于在哪里你应该这样做(也是为了访问服务提供商),我建议你在你的Startup配置方法。该方法可以将任何依赖项作为参数,因此您可以轻松地在那里注入(inject)服务提供者:

public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider, IApplicationLifetime applicationLifetime)
{
var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
{
var host = sbc.Host(new Uri("rabbitmq://localhost"), h =>
{
h.Username("guest");
h.Password("guest");
});

sbc.ReceiveEndpoint(host, Configuration["QueueName"], e =>
{
e.LoadFrom(serviceProvider);
});
});

// start/stop the bus with the web application
applicationLifetime.ApplicationStarted.Register(bus.Start);
applicationLifetime.ApplicationStopped.Register(bus.Stop);
}

最后的免责声明:我个人没有使用过 MassTransit,所以我真的不知道这对图书馆是否有意义。

关于c# - MassTransit 和 .NET Core DI - 如何使用无参数构造函数解决依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47954136/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com