这仅仅是因为 Rebus 默认使用带有 TypeNameHandling.All 的 Newtonsoft JSON.NET,这意味着 $type 字段包含在每个包含序列化类型的完整 .NET 类型名称的序列化对象中。
好处是您可以序列化几乎任何东西,即使它可能包含由(可能是抽象的)超类型甚至接口引用的实例。
例如此命令消息类型
public class ProcessFile
{
public ProcessFile(string filePath, IEnumerable<IFileProcessingTask> tasks)
{
FilePath = filePath;
Tasks = tasks;
}
public string FilePath { get; }
public IReadOnlyCollection<IFileProcessingTask> Tasks { get; }
}
可以包含IFileProcessingTask 的任意实现,例如像
public class GZipFileProcessingTask : IFileProcessingTask
{
// ...
}
只要收件人可以通过$type 字段的值查找类型即可。
如果你想在另一个平台上处理这种类型的消息,你可以简单地让它忽略每个对象的$type字段。这可能很容易/很难/不可能,具体取决于您的 JSON 序列化程序的灵活性。
另一种选择是简单地用你自己的实现替换 Rebus 的序列化器
Configure.With(...)
.(...)
.Serialization(s => s.UseCustomJsonSerialization())
.Start();
UseCustomJsonSerialization 是一个扩展方法,您可以这样实现:
public static class RebusConfigEx
{
public static void UseCustomJsonSerialization(this StandardConfigurer<ISerializer> configurer)
{
configurer.Register(c => new YourCustomJsonSerializer());
}
}
然后剩下要做的就是创建类YourCustomJsonSerializer作为ISerializer的实现。