RabbitMq EasyNetQ使用Activator.CreateInstance创建消息

本文关键字:创建 消息 CreateInstance Activator EasyNetQ 使用 RabbitMq | 更新日期: 2023-09-27 18:11:18

我有一个问题我不完全明白。当我以这种方式创建消息时,它是工作的:

var message = new StartFakeJobCommand();
using (var publishChannel = ApplicationSingleton.Instance.RabbitBus.OpenPublishChannel())
{
    publishChannel.Publish(message);
}

消息被放到队列中,侦听器可以使用它。但是,当我使用Activator创建消息时。像这样创建实例不起作用。没有任何内容被发布到队列。

var t = Type.GetType(string.Format("{0}.{1},{2}", job.CommandNamespace, job.Command, job.AssemblyName));
if (t == null)
    throw new ArgumentException();
var message = Activator.CreateInstance(t);
using (var publishChannel = ApplicationSingleton.Instance.RabbitBus.OpenPublishChannel())
{
    publishChannel.Publish(message);
}

在调试期间,我可以清楚地看到使用这两种方法创建了相同的类型。知道为什么第二种方法不起作用吗?

这是我订阅消息的方式:

bus.Subscribe<StartFakeJobCommand>("StartFakeJobCommand_ID", message => fakeJob.Handle(message));

RabbitMq EasyNetQ使用Activator.CreateInstance创建消息

Activator的签名。CreateInstance除外:

public static Object CreateInstance(
    Type type
)

消息的类型是Object,所以你的消息被发布为Object类型,因为你没有Object的订阅者,所以它是黑洞。

publishChannel打电话。使用正确的泛型发布以解决问题。