我还没有找到如何使用其他界面然后发布的解决方案。
在简单的情况下,如果我想发布IMessage并使用IMessage,我必须在两个应用程序之间共享具有IMessage定义的程序集。
但如果这两个应用程序是由不同的公司开发的话。
在这种情况下,我有两个选择:
就通用接口,命名约定等达成协议并共享公共库
让两家公司按照惯例和内部服务总线(或应用服务器)地图数据类型完成工作。
第二个选项对我来说更合适,但我还没有找到解决方案。
例如,我可能在一个系统中有一名员工
public interface IEmployee
{
int ID { get; set; }
string FirstName { get; set; }
string LastName { get; set; }
}
在其他系统中
public interface ILightEmployee
{
int id { get; set; }
string full_name { get; set; }
}
我想发布IEmployee并使用ILightEmployee。
在我想要的服务总线的序列化/反序列化阶段 使用一些属性映射并存档这样的东西(它更像是一个伪代码):
public class ContractMapper
{
public LightEmployee Map(IEmployee employee)
{
return new LightEmployee()
{
id = employee.ID,
full_name = employee.LastName + " " + employee.FirstName
};
}
}
例如,MuleESB为此转换/映射提供了一个编辑器。 LINK
这对我来说是不必要的高级解决方案,但至少在代码中我想做同样的事情。
是否可以使用Rebus服务总线?
答案 0 :(得分:0)
只要Rebus能够将传入的JSON对象正确反序列化为具体类,它就会尝试将消息分发给所有与多态兼容的处理程序。
使用默认的Newtonsoft JSON.NET和Jil-based JSON serializer,rbs2-content-type
标头将设置为application/json;charset=utf-8
,并且只要传入消息的标头以application/json
开头并且具有兼容的编码,两个序列化器都会尝试反序列化为rbs2-msg-type
标头指定的类型。
因此,如果您在应用程序域中提供了匹配的具体类,那么您可以拥有一个实现IHandleMessages<IEmployee>
或IHandleMessages<ILightEmployee>
- 或IHandleMessages<object>
的处理程序,因为该处理程序与所有传入的消息在多态上兼容。
Jil序列化程序是特殊的,因为如果找不到它应该反序列化的.NET类型,它将反序列化为dynamic
。
这意味着这个处理程序:
public class HandlesEverything : IHandleMessages<object>
{
public async Task Handle(dynamic message)
{
// .... woohoo!
}
}
与Jil序列化器配合使用,可以动态处理所有消息,挑选出感兴趣的部分。
我希望答案给人一种Rebus的一些可能性的印象。请告诉我更多是否有一种情况,你觉得这种情况不是很好。