CAP 提供了 ISerializer
接口来支持对消息进行序列化,默认情况下我们使用 json 来对消息进行序列化处理并存储到数据库中。
public class YourSerializer: ISerializer
{
Task<TransportMessage> SerializeAsync(Message message)
{
}
Task<Message> DeserializeAsync(TransportMessage transportMessage, Type valueType)
{
}
}
然后将你的实现注册到容器中:
//注册你的自定义实现
services.AddSingleton<ISerializer, YourSerializer>();
// ---
services.AddCap
在异构系统中,有时候需要和其他系统进行通讯,但是其他系统使用的消息对象可能和 CAP 的包装器对象不一样,这个时候就需要对消息进行自定义适配。
CAP 提供了 IMessagePacker
接口用于对 包装器对象 进行自定义,自定义的 MessagePacker 通常是将 CapMessage
进行打包和解包操作,在这个过程中可以添加自己的业务对象。
使用方法:
class MyMessagePacker : IMessagePacker
{
private readonly IContentSerializer _serializer;
public DefaultMessagePacker(IContentSerializer serializer)
{
_serializer = serializer;
}
public string Pack(CapMessage obj)
{
var myStructure = new
{
Id = obj.Id,
Body = obj.Content,
Date = obj.Timestamp,
Callback = obj.CallbackName
};
return _serializer.Serialize(myStructure);
}
public CapMessage UnPack(string packingMessage)
{
var myStructure = _serializer.DeSerialize<MyStructure>(packingMessage);
return new CapMessageDto
{
Id = myStructure.Id,
Timestamp = myStructure.Date,
Content = myStructure.Body,
CallbackName = myStructure.Callback
};
}
}
接下来,配置自定义的 MyMessagePacker
到服务中。
services.AddCap(x =>{ }).AddMessagePacker<MyMessagePacker>();