C# 如何为实现多个接口的对象处理DTO?

C# 如何为实现多个接口的对象处理DTO?,c#,.net,wcf,web-services,dto,C#,.net,Wcf,Web Services,Dto,我们在WCF服务接口中使用Dto,但是当Dto所代表的业务对象实现了多个接口时,我们开始遇到问题,我们希望在这些不同的上下文中返回Dto,并且能够在客户端上多态地处理Dto 例如,假设我们有一个IBusinessObject接口,该接口具有多个属性,其中包含对象关系的详细信息,对象的属性等。我有几个实现这一个是LinearBusinessObject,实现IBusinessObject和linear。还有其他ILinear的实现,它们也不是业务对象,只是简单的线性对象 我们的服务有一个获取业务对

我们在WCF服务接口中使用Dto,但是当Dto所代表的业务对象实现了多个接口时,我们开始遇到问题,我们希望在这些不同的上下文中返回Dto,并且能够在客户端上多态地处理Dto

例如,假设我们有一个
IBusinessObject
接口,该接口具有多个属性,其中包含对象关系的详细信息,对象的属性等。我有几个实现这一个是
LinearBusinessObject
,实现
IBusinessObject
linear
。还有其他
ILinear
的实现,它们也不是业务对象,只是简单的线性对象

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

我们还需要一种方法,可以得到一个线性的东西。这将返回一个基类
LinearDto
,其中包含常见的线性详细信息。简单的线性对象实现扩展了
LinearDto
,一切都很好。但是现在我有一个问题,因为我不能让我的
LinearBusinessObjectDto
LinearDto
BusinessObjectDto
扩展,因为只支持单一继承,而且我不能使用接口,因为WCF不知道接下来要在WDSL中的服务契约定义中放入什么类型

因此,我已经开始为我的
LinearBusinessObject
创建两个DTO,一个源于
BusinessObjectDto
LinearBusinessObjectAsBusinessObjectDto
),另一个源于LinearDto(
LinearBusinessObjectAsLinearDto
),然后根据我感兴趣的接口对每个DTO进行转换


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

WCF提供了一个钩子,用于定义接口和继承链上的“已知类型”。我不确定使用或直接适用于您所描述的内容,但它绝对值得一看。

这是一个内部web服务还是您将在外部托管它

如果这是内部的,请查看“配置服务引用”对话框中的“在引用的程序集中重用类型”选项

  • 在客户端项目中引用DTO程序集(确保DTO位于其自己的程序集中)

  • 为目标WCF服务打开“配置服务参考”对话框

  • 选中“在引用的程序集中重用类型”复选框

  • 选择“在指定的引用程序集中重用类型”单选按钮

  • 从列表中选择DTO部件


  • ServiceClient()
    收到的结果将是引用的DTO程序集的实际类型,而不是生成的代理。现在,您应该能够以多态方式对对象进行操作

    也许您可以封装基本对象。因此,您的BusinessObjectDto和LinearDto对象。然后,您的LinearBusinessObjectDto包含两个属性,一个为BusinessObjectDto类型,另一个为LinearObjectDto类型。当服务方法返回LinearBusinessObjectDto时,它将初始化这些属性中的每个属性。然后,您可以尽可能在LinearBusinessObjectDto上实现接口,并删除对每个属性的调用。不幸的是,在客户端上,您可以强制转换到所需的接口,但您应该能够选择要使用的属性


    编辑:不确定DTO部件上的接口…不知道是否将在具有接口的客户端上创建实现接口的DataContract属性类

    我想我已经理解了你想说的话,如果我错过了,请原谅。基本上,您希望通过WCF合同传递以下对象:

    类规范实现A:IInterfaceA
    类规范B:IIinterfaceB的实现
    类别组合OFA和B:IInterfaceA,IInterfaceB
    
    您提到您不想在WCF合同上使用接口,因为您可能会返回接口的不同实现

    我的问题是,您是否确实需要返回给客户机的对象的相同实现,您是否确实需要客户机接收一个of和b组合的实例,或者它是否可以是具有相同签名的其他对象。其次,客户是否返回过这些对象,如果是,上述问题如何适用

    如果这个问题的答案是客户端和服务不关心,那么您可以引入一个客户端特定的对象,该对象实现所讨论的接口,并在客户端knowntypes中注册(knowntypes用于反序列化而不是序列化),并让WCF进行映射

    接口IIinterfaceA和B:IIinterfaceA,IIinterfaceB
    接口等距WCFContract
    {
    i接口a GetA();
    IInterfaceB GetB();
    IInterfaceAAndB getAAandB();
    }
    类ClientImplementationOfA:IInterfaceA
    类客户端B:IIinterfaceB的实现
    类客户端和B的实现:iInterfaceA和B
    私有静态IEnumerable GetKnownType()
    {
    收益率返回类型(客户端实现);
    收益率-收益率类型(clientimplementofb);
    收益率返回类型(客户)
    
    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
    public interface IServer
    {
      [OperationContract]
      [ServiceKnownType(typeof(EntityInfo))]
      IEntityInfo GetEntityInfo(string className);
    }