2013-04-29 116 views
0

我有一个问题,我不完全明白。 当我创建消息这样它的工作原理:RabbitMq EasyNetQ使用Activator.CreateInstance创建消息

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

的消息被放入队列中,我的听众可以使用它。 但是,当我使用创建消息Activator.CreateInstance像这样,它不起作用。没有任何内容发布到队列中。

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)); 

回答

1

Activator.CreateInstance的签名是:

public static Object CreateInstance(
    Type type 
) 

消息的类型为对象,所以你的消息被公布为Object类型并且由于您没有Object的订阅者,所以它是黑色的。

使用正确的泛型类型调用publishChannel.Publish来解决问题。