首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Masstransit发送ICommand

Masstransit发送ICommand
EN

Stack Overflow用户
提问于 2017-11-20 12:33:32
回答 2查看 1.7K关注 0票数 1

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

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

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

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

下面是代码的一个示例:

代码语言:javascript
复制
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);加载命令处理程序。

更新

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

代码语言:javascript
复制
var type = cmd.Body.GetType();

是否可以使用该类型作为泛型参数:

代码语言:javascript
复制
this._commandBus.Send(cmd.Body).Wait();

我想是问题所在吧?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-20 15:02:31

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

票数 0
EN

Stack Overflow用户

发布于 2017-11-20 12:56:36

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47392143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档