【发布时间】:2019-09-30 20:25:48
【问题描述】:
因此,EasyNetQ 自动订阅者有一个基本的默认调度程序,它无法使用非无参数构造函数创建消息消费者类。
要查看实际情况,请创建一个具有所需依赖项的使用者。您可以设置自己的服务,也可以使用由框架默认自动注册的ILogger<T>。
ConsumeTextMessage.cs
public class ConsumeTextMessage : IConsume<TextMessage>
{
private readonly ILogger<ConsumeTextMessage> logger;
public ConsumeTextMessage(ILogger<ConsumeTextMessage> logger)
{
this.logger = logger;
}
public void Consume(TextMessage message)
{
...
}
}
连接自动订阅者(在哪里/何时编写/运行此代码方面存在一些余地)。
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IBus>(RabbitHutch.CreateBus("host=localhost"));
}
(其他地方,可能是startup.Configure 或BackgroundService)
var subscriber = new AutoSubscriber(bus, "example");
subscriber.Subscribe(Assembly.GetExecutingAssembly());
现在,启动程序并发布一些消息,您应该会看到每条消息都在默认错误队列中结束。
System.MissingMethodException: No parameterless constructor defined for this object.
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean wrapExceptions, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean wrapExceptions, Boolean skipCheckThis, Boolean fillCache)
at System.Activator.CreateInstance[T]()
at EasyNetQ.AutoSubscribe.DefaultAutoSubscriberMessageDispatcher.DispatchAsync[TMessage,TAsyncConsumer](TMessage message)
at EasyNetQ.Consumer.HandlerRunner.InvokeUserMessageHandlerInternalAsync(ConsumerExecutionContext context)
我知道我可以提供我的own dispatcher,但是我们如何与 ASP.NET Core 服务提供商一起工作;确保这适用于范围服务?
【问题讨论】:
标签: asp.net-core easynetq