我们可以使用 masstransit 一起使用 RabbitMQ 和 Mediatr 吗?

Can we use RabbitMQ and Mediatr together using masstransit?

我创建了一个微服务应用程序,它使用 MassTransitRabbitMQ 进行微服务通信。
每个微服务都使用干净的架构开发,因此我们在每个微服务中都有 MediatR
是否也可以使用 MassTransit 进行内部通信?因此我可以对所有服务使用相同的签名,并且当我想公开要在微服务间使用的服务时,这将很容易实现。 所以MediatR用于内部通信,RabbitMQ用于内部通信,整个宇宙都在MassTransit系统上。
[更新] 我的问题是我们如何配置消费者,以便一些可以用于内部通信(通过 MediatR),一些可以用于外部通信(通过 RabbitMQ),并轻松地从从内到外。
[Update2] 例如这是我的 MassTransit 注册:

services.AddMassTransit(x =>
        {
            x.AddConsumers(Assembly.GetExecutingAssembly());

            x.AddBus(provider =>
                Bus.Factory.CreateUsingRabbitMq(cfg =>
                {
                    cfg.Host(new Uri(config.RabbitMQ.Address), h =>
                    {
                        h.Username(config.RabbitMQ.Username);
                        h.Password(config.RabbitMQ.Password);
                    });

                    cfg.ReceiveEndpoint("my-queue", ep => { ep.ConfigureConsumers(provider); });
                }));


            x.AddMediator((provider, cfg) => { cfg.ConfigureConsumers(provider); });
        });

内部沟通和外部沟通有何不同?换句话说,我如何才能将一些消费者注册到 MediatR 而将一些消费者注册到 RabbitMQ?

它们可以一起使用,MassTransit 也有自己的中介器实现,因此您只需编写一次处理程序,然后通过中介器或持久传输(如 RabbitMQ)使用它们。

videos 可用的功能,可以带您了解这些功能,从中介开始,然后转移到 RabbitMQ。

我发现我应该为每个创建一个单独的总线。然后外部服务继承自 IExternalConsumer 等接口,因此我可以将它们与内部服务分开并将它们添加到相关总线: 版本 7 已更新

        // find consumers
        var types = AssemblyTypeCache.FindTypes(new[]{Assembly.GetExecutingAssembly()},TypeMetadataCache.IsConsumerOrDefinition).GetAwaiter().GetResult();
        var consumers = types.FindTypes(TypeClassification.Concrete | TypeClassification.Closed).ToArray();
        var internals = new List<Type>();
        var externals = new List<Type>();
        foreach (Type type in consumers)
        {
            if (type.HasInterface<IExternalConsumer>())
                externals.Add(type);
            else
                internals.Add(type);
        }

        services.AddMediator(x =>
        {
            x.AddConsumers(internals.ToArray());
            x.ConfigureMediator((provider, cfg) => cfg.UseFluentValidation());
        });
        services.AddMassTransit<IExternalBus>(x =>
        {
            x.AddConsumers(externals.ToArray());
            x.AddBus(provider =>
                Bus.Factory.CreateUsingRabbitMq(cfg =>
                {
                    cfg.Host(new Uri(config.RabbitMQ.Address), h =>
                    {
                        h.Username(config.RabbitMQ.Username);
                        h.Password(config.RabbitMQ.Password);
                    });

                    cfg.ReceiveEndpoint(apiProviderName, ep => { ep.ConfigureConsumers(provider); });

                }));
        });

        services.AddMassTransitHostedService();