我有一个存储在DB中的ICommand列表,用于遗留过程管理器(我还没有时间将所有代码转换为使用Sagas )。
我需要能够反序列化命令列表并发送它们。
为了能够在c#中表示命令,我有一个列表
循环遍历列表并对每个列表调用send会导致一个问题,因为Masstransit只看到一个ICommand,而不是底层类型(即使命令是使用type 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();我想是问题所在吧?
发布于 2017-11-20 15:02:31
如果您拥有数据库中的具体对象,并且正在正确地对其进行反序列化,请在object中使用Send的过载,而不是使用接口重载。通过使其成为对象,MassTransit将在运行时确定该类型,并对实际对象类型使用匹配的序列化程序,而不是指定的接口类型。
发布于 2017-11-20 12:56:36
如果您知道底层消息类型,则可以使用context.TryGetPayload<T>检索所需的对象。
https://stackoverflow.com/questions/47392143
复制相似问题