无法使用 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) 中向消费者注入服务的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ 和 MassTransit 之间的连接

使用交换和使用 MassTransit 的路由密钥发布消息

如何托管MassTransit和RabbitMq

AspNetCore&MassTransit Courier实现分布式事务

如何在实体框架中持久保存 MassTransit 状态数据?

如何在 ASP.NET Core Web API 中使用 MassTransit 事件总线?