如何处理实现多个接口的对象的Dtos?

Sam*_*der 8 .net c# wcf web-services dto

我们在WCF服务接口中使用Dtos,但是当Dto表示的业务对象实现多个接口并且我们想要在这些不同的上下文中返回Dtos并且还能够处理时,它们已经开始遇到问题Dtos在客户端上进行多态化.

例如,假设我们有一个IBusinessObject包含多个属性的接口,这些属性包含对象关系,对象属性等的详细信息.我有几个实现,这个LinearBusinessObject实现IBusinessObjectILinear.还有其他实现ILinear不是业务对象,只是简单的线性事物.

我们的服务有一个获取业务对象的方法.这将返回一个基本Dto类(BusinessObjectDto),它声明了IBusinessObject(关系属性等)的公共部分,并LinearBusinessObjectDto扩展BusinessObjectDto并添加了有关线性方面的额外信息.这很好,并使客户端能够BusinessObjects以一定程度的多态性处理返回的内容.

我们还想要一种获得线性事物的方法.这将返回一个LinearDto包含公共线性详细信息的基类.简单的线性对象实现扩展LinearDto,一切都很好.但是现在我遇到了一个问题,因为我无法LinearBusinessObjectDto从两者扩展LinearDto而且BusinessObjectDto因为只支持单继承,并且我不能使用接口,因为WCF不知道哪些类型然后放入服务合同定义中WDSL.

所以我开始为我的2 dtos LinearBusinessObject,一个派生自BusinessObjectDto(LinearBusinessObjectAsBusinessObjectDto)和一个派生自LinearDto(LinearBusinessObjectAsLinearDto),然后根据我感兴趣的界面转换每个.

这似乎会导致许多额外的Dto类(我已经有很多),所以我想知道是否有比这更好的解决方案?或者这只是我们必须忍受的东西?

MrL*_*ane 13

一位聪明人曾告诉我,面向对象是服务的敌人.

在我看来,这是一个普遍的OO/SOA问题,而不是一个特定的WCF问题:我想到了"赞成组合而不是继承"的旧建议.特别是在服务方面,Polymorphic设计不应该是您在DTO层中所追求的.您应该避免使用使用继承或接口的DTO(除非您动态地序列化/反序列化,否则甚至不可能使用接口...您无法使用SVCUtil生成具体代理,因为具体类型在生成时是未知的,但是来自我的在.NET客户端中使用ChannelFactories时,这是可能的...我不记得细节了.

通常,在创建DTO/DataContracts时,只在其中定义具体的成员/属性.您的DTO模型应设计为平面和跨平台,而不是面向对象.