Masstransit发送ICommand

时间:2017-11-20 12:33:32

标签: rabbitmq masstransit

我有一个ICommand列表,我存储在数据库中,用于遗留流程管理器(我没有时间将所有代码转换为使用Sagas)

我需要能够反序列化命令列表并发送它们。

为了能够在c#中表示命令,我有一个List

循环遍历列表并在每个列表上调用send会导致问题,因为Masstransit只能看到ICommand而不是底层类型(即使命令是使用类型信息序列化的

以下是代码示例:

if (deserializedCommands == null)
{
   deserializedCommands = this._serializer.Deserialize<IEnumerable<Envelope<ICommand>>>(undispatched.Commands).ToList();

   while (deserializedCommands.Count > 0)
   {
       var cmd = deserializedCommands.First();

       this._commandBus.Publish(cmd.Body).Wait();

       deserializedCommands.RemoveAt(0);
   }
}

将鼠标悬停在调试器中的cmd.Body上会显示正确的类型。

但Masstransit只看到ICommand:

  

未找到消息类型xxxx.ICommand的约定

我怎样才能让MT看到正确的类型?

谷歌搜索引出了一些关于EndpointConvention的内容,但它看起来并没有被记录或完整,还有关于拓扑的讨论,但我找不到任何相关内容。

我可以做些什么来完成这项工作?我正在使用城堡windsor集成并通过ep.LoadFrom(container);

加载我的命令处理程序

[UPDATE]

我可以使用以下方式获取消息的基础类型:

var type = cmd.Body.GetType();

无论如何都要使用该类型作为通用参数:

this._commandBus.Send(cmd.Body).Wait();

我猜是个问题?

2 个答案:

答案 0 :(得分:0)

如果你知道底层消息类型,可以使用context.TryGetPayload<T>来检索所需的对象。

答案 1 :(得分:0)

如果您拥有数据库中的具体对象并正确反序列化,请在MassTransit中使用object Send重载,而不是使用接口重载。通过使其成为一个对象,MassTransit将在运行时确定类型,并使用匹配的序列化器来实现实际的对象类型而不是指定的接口类型。