下面的图描述了
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是真实对象。他们可以有方法,但是这些方法不是序列化过程的一部分
答案 0 :(得分:0)
如何使用序列化类(DataContract消息)在层次结构中实现多态性
“多态数据协定”是矛盾的。
数据合同是WCF的DTO(数据传输对象)实现。
WCF明确将数据(数据合同,DTO)与行为(服务)分开。
请勿混合它们。
换句话说:
我尽量避免引入其他类,例如RequestProcessors
但是你不应该!
这是基于服务的解决方案的自然方法,而不仅仅是WCF(SOAP)。例如REST(如果是.NET,则为ASP(.NET Web API)。)
此外,基于服务的方法非常适合应用程序内部的业务逻辑实现,因为它非常适合依赖注入容器。
执行一些IRequestProcessor
层次结构-这是正确的方法。
注意,链接的question与继承有关,但与行为继承无关。 IMO,“多态性”一词在这里被滥用。您可以 (通常应该)从另一个合同中导出一个数据合同,但是您可以(应该)导出 data ,而不是行为。