如何在Windsor容器中注入依赖项MassTransit Consumer

问题描述

如何在使用者类中使用依赖项注入。我收到错误消息“类型为'Esb.Masstransit.RabbitMq.Application.IEventConsumerService'的类型参数'TConsumer'在通用类型或方法'Masstransit.ConsumerExtensions.Consumer(Masstransit.IReceiveEndpointConfigurator,System.Action )”。没有从“ Esb.Masstransit.RabbitMq.Application.IEventConsumerService”到“ Masstransit.IConsumer”的隐式引用转换。”

这是容器类

container.Register(Component.For<IEventConsumerService>().ImplementedBy<EventConsumerService>().LifestyleSingleton());
container.Register(Component.For<ICommandConsumerService>().ImplementedBy<CommandConsumerService>().LifestyleSingleton());

var busControl = Bus.Factory.CreateUsingRabbitMq(rabbit =>
        {
            var host = rabbit.Host(new Uri(rabbitMqHost),settings =>
            {
                settings.Password(rabbitMqUserName);
                settings.Username(rabbitMqPassword); 
            }); 

            rabbit.ReceiveEndpoint(host,eventQueue1,e =>
            {
                e.BindMessageExchanges = false; 
               e.Consumer<EventConsumerService>(); // I getting error here
                e.Bind(typeof(IPublishMessage).FullName.Split('.').LastOrDefault(),x =>
                {
                    x.RoutingKey = "1";
                    x.ExchangeType = ExchangeType.Direct;
                });
            }); 
        }); 
        container.Register(Component.For<IBus,IBusControl>().Instance(busControl));

这是消费者类

public class EventConsumerService : BaseLogger,IEventConsumerService,IConsumer<IPublishMessage>
{
    private readonly ICommandConsumerService _service;

    public EventConsumerService(ICommandConsumerService service)
    {
        _service = service;
    }

    public Task Consume(ConsumeContext<IPublishMessage> context)
    {
        try
        { 
            Console.WriteLine("In event consumer " + context.MessageId + " _" + context.Message.MessageId + "," + context.Message.Message + " " + context.Message.CreationDate);
            return Task.CompletedTask;
        }
        catch (Exception ex)
        {
           Logger.Error("EventConsumerService",ex);
        }
        return Task.CompletedTask;
    } 
}

解决方法

您应该使用容器集成软件包MassTransit.CastleWindsor并按照documentation所示配置容器。

此外,应该将使用者注册为具体类型,而不是接口。

根据您的示例:

var container = new WindsorContainer();
container.AddMassTransit(x =>
{
    x.AddConsumer<EventConsumerService>();

    x.UsingRabbitMq(cfg =>
    {
        cfg.Host(new Uri(rabbitMqHost),settings =>
        {
            settings.Password(rabbitMqUserName);
            settings.Username(rabbitMqPassword); 
        }); 

        cfg.ReceiveEndpoint(eventQueue1,ec =>
        {
            ec.ConfigureConsumeTopology = false; 
            ec.Bind(typeof(IPublishMessage).FullName.Split('.').LastOrDefault(),b =>
            {
                b.RoutingKey = "1";
                b.ExchangeType = ExchangeType.Direct;
            });

            ec.ConfigureConsumer<EventConsumerService>(context);
        });
    });
});

消费者不应该是单身人士,而应确定范围。上面的代码将为您在容器中注册消费者。