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

Polymorphism in hierarchy with serialised classes - DataContract messages

下图描述了如何

This article 讨论了类似的问题。
但是我需要在相同的 class 层次结构中将 DTO(在 DataContract.DLL 中)和链接到此 DTO 的某些实现(App.EXE)分开(我尽量避免引入另一个 [=53= 系列) ]像 RequestProcessors)。
实施应该在 不同的 程序集中被覆盖,而不是定义为 DTO/message 的 dll - 这个 dll 应该是轻量级的 - 由不同的团队使用。因此,我不能像上述文章中那样在属性 [KnownType(typeof(SomeData))] 中引用派生 class。我不想在 DataContract.DLL.

中包含方法实现

如何使用序列化的 classes(DataContract 消息)在层次结构中实现多态性,其中 DataContracts 和实现在不同的程序集中分离?可能吗?

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

也许多文件汇编会起作用?也许扩展方法是最接近的近似值。

已更新(quotation from article):

DTOs that are decorated as DataContract classes are real objects. They can have methods in them, but the methods are not part of the serialization process

How to implement polymorphism in hierarchy with serialised classes (DataContract messages)

"Polymorphic data contract " 是矛盾的。

数据协定是 WCF 的 DTO(数据传输 对象)实现。
WCF 明确地将数据(数据契约,DTO)与行为(服务)分开。

不要混合使用。

换句话说:

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

I try to avoid introducing another family of classes like RequestProcessors

但你不应该这样做!

这是基于服务的解决方案的自然方法,而不仅仅是关于 WCF (SOAP)。例如,REST(ASP .NET Web API 在 .NET 的情况下)做同样的事情。

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

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

注意,链接question是关于继承,而不是关于行为继承。 IMO,术语 "polymorphism" 在那里被滥用。您可以(而且通常应该)从一个数据契约派生另一个数据契约,但是您可以(应该)派生数据,而不是行为