【问题标题】:Masstransit sending ICommand公共交通发送 ICommand
【发布时间】:2017-11-20 12:33:32
【问题描述】:

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

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

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

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

下面是代码示例:

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 的信息,但它看起来不像记录或完整,还有关于拓扑的讨论,但我找不到任何关于它的信息。

我可以做些什么来完成这项工作?我正在使用城堡温莎集成并通过ep.LoadFrom(container); 加载我的命令处理程序

[更新]

我可以使用以下方法获取消息的底层类型:

var type = cmd.Body.GetType();

有没有将该类型用作通用参数:

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

我猜是这个问题?

【问题讨论】:

    标签: rabbitmq masstransit


    【解决方案1】:

    如果您知道底层消息类型,您可以使用context.TryGetPayload&lt;T&gt; 来检索您需要的对象。

    【讨论】:

    • 这是在接收端吗?
    • 这个问题是消息只包含 ICommand 中指定的属性,这只是一个 ID
    • 在消费者内部,您应该调用我在回答中编写的方法。但我误解了你。你想发送,克里斯已经回答了。
    【解决方案2】:

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

    【讨论】:

    • 工作就像一个魅力,在我费力地摆弄各种(复杂得多)的东西来使它工作之后——这样一个立即奏效的简单解决方案是巨大的 :) 谢谢! :)
    • 您不是第一个遇到此问题的人。我相信你现在已经猜到了。
    • 有一个顺利的解决方案,TBF 文档警告我的方案!我正在更新一些旧代码并希望迭代转换,这达到了最佳效果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2012-03-08
    • 2021-02-10
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    相关资源
    最近更新 更多