无法使用 MassTransit 在 Windows 服务应用程序 (.Net Core 3.1) 中向消费者注入服务
Posted
技术标签:
【中文标题】无法使用 MassTransit 在 Windows 服务应用程序 (.Net Core 3.1) 中向消费者注入服务【英文标题】:Fail to inject a service to Consumer in a Windows service application (.Net Core 3.1) using MassTransit 【发布时间】:2022-01-18 13:08:21 【问题描述】:我尝试使用 MassTransit 在 Windows 服务应用程序中向 Consumer 构造函数注入 ITest,但失败了。
这是我尝试过的:
程序.cs
public class Program
static void Main(string[] args)
CreateHostBuilder(args).Build().Run();
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
ConfigureServices(services);
).UseWindowsService();
private static void ConfigureServices(IServiceCollection services)
services.AddHostedService<TestService>();
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
services.AddTransient<ITest, Test>();
TestService.cs
public class TestService : BackgroundService
private IBusControl _bus;
public TestService()
protected async override Task ExecuteAsync(CancellationToken stoppingToken)
_bus = Bus.Factory.CreateUsingAzureServiceBus(cfg =>
cfg.Host("myconnection");
cfg.ReceiveEndpoint("myqueue", endpoint =>
endpoint.Consumer<TestConsumer>(); //error when build the project
);
);
await _bus.StartAsync();
TestConsumer.cs
public class TestConsumer : IConsumer<MyTestObject>
private ITest _test;
public TestConsumer(ITest test)
_test = test;
public async Task Consume(ConsumeContext<MyTestObject> context)
当我构建整个项目时出现错误 CS0310
The type ... must be a non-abstract type with a public parameterless constructor in order to use it as parameter ...
我有一个搜索,他们在 ConfigureServices 函数中使用 services.AddMassTransit。但在我的应用程序中,我用作 Windows 服务,而不是控制台应用程序。
那么如何将我的 ITest 注入到 TestService 的构造函数中?
提前致谢。
【问题讨论】:
【参考方案1】:您在后台服务中实例化总线。 DI 容器和总线实例之间没有连接。在这种情况下,您如何期望将任何东西注入消费者?
您需要做的就是遵循文档,它会起作用。
Configure MassTransit for ASP.NET Core 使用提供的示例,将总线实例移动到 ConfigureServices
函数,删除您的后台服务并使用提供的 MassTransitHostedService
,如文档中所述。
public void ConfigureServices(IServiceCollection services)
services.AddMassTransit(x =>
x.AddConsumer<EventConsumer>();
x.UsingRabbitMq((context, cfg) =>
cfg.ReceiveEndpoint("event-listener", e =>
e.ConfigureConsumer<EventConsumer>(context);
);
);
);
services.AddMassTransitHostedService();
不管你是在 Windows 服务、Docker 容器还是其他什么的。
【讨论】:
好的,谢谢,但是如何处理 TestService 呢?我想在 StartAsync 和 StopAsync 中开始接收消息并停止接收消息。 删除TestService
,MassTransit 托管服务将启动/停止公交车。
嗨,Alexey 和 Chris,感谢您的回复。我看过这个dgtechboost.com/2020/07/20/… 并使用 BusHostedService: IHostedService 代替我的 TestService。以上是关于无法使用 MassTransit 在 Windows 服务应用程序 (.Net Core 3.1) 中向消费者注入服务的主要内容,如果未能解决你的问题,请参考以下文章
AspNetCore&MassTransit Courier实现分布式事务