具有序列化类的层次结构中的多态-DataContract消息

时间:2018-07-06 04:55:12

标签: c# serialization polymorphism datacontract

下面的图描述了

  • 生产者创建填充数据成员的新消息/请求,
  • 邮件已序列化,
  • 发送给消费者
  • 序列化,
  • 消费者调用虚拟函数-使用基类引用的多态行为。

This article讨论了类似的问题。
但是我需要在同一类层次结构中将DTO(在DataContract.DLL中)和一些与此DTO链接的实现(App.EXE)分开(我尽量避免引入其他类家族,例如RequestProcessors)。
与具有DTO /消息定义的dll相比,应在不同程序集中重写实现-该dll应该是轻型的-由不同团队使用。因此,我不能像提到的文章那样在属性[KnownType(typeof(SomeData))]中引用派生类。我不想在DataContract.DLL中包含方法实现。

如何使用序列化类(DataContract消息)在层次结构中实现多态,在这些序列化类中,DataContracts和实现在不同的程序集中分开?有可能吗?

我没有找到方法,但是C#不是我的主要语言。我看到生产者不应该依赖Consumer.EXE,而应该创建大多数派生类。因此,所有类都应在DataContracts.DLL中引入。部分类定义可能不是交叉组装。

也许多个文件汇编可以工作?扩展方法也许是最接近的近似值。

已更新(quotation from article):

  装饰为DataContract类的

DTO是真实对象。他们可以有方法,但是这些方法不是序列化过程的一部分

enter image description here

1 个答案:

答案 0 :(得分:0)

  

如何使用序列化类(DataContract消息)在层次结构中实现多态性

“多态数据协定”是矛盾的。

数据合同是WCF的DTO(数据传输对象)实现。
WCF明确将数据(数据合同,DTO)与行为(服务)分开。

请勿混合它们。

换句话说:

  • 不要尝试在DTO层次结构中实现多态性;
  • 请勿向DTO添加任何行为。
  

我尽量避免引入其他类,例如RequestProcessors

但是你不应该!

这是基于服务的解决方案的自然方法,而不仅仅是WCF(SOAP)。例如REST(如果是.NET,则为ASP(.NET Web API)。)

此外,基于服务的方法非常适合应用程序内部的业务逻辑实现,因为它非常适合依赖注入容器。

执行一些IRequestProcessor层次结构-这是正确的方法。

注意,链接的question与继承有关,但与行为继承无关。 IMO,“多态性”一词在这里被滥用。您可以 (通常应该)从另一个合同中导出一个数据合同,但是您可以(应该)导出 data ,而不是行为