如何解决如何在Windsor容器中注入依赖项MassTransit Consumer
如何在使用者类中使用依赖项注入。我收到错误消息“类型为'Esb.Masstransit.RabbitMq.Application.IEventConsumerService'的类型参数'TConsumer'在通用类型或方法'MassTransit.ConsumerExtensions.Consumer(MassTransit.IReceiveEndpointConfigurator,System.Action
这是容器类
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);
});
});
});
消费者不应该是单身人士,而应确定范围。上面的代码将为您在容器中注册消费者。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。