C# 是什么驱动了数据传输对象的设计?

C# 是什么驱动了数据传输对象的设计?,c#,web-services,dto,C#,Web Services,Dto,我正在编写一个web服务。我还在编写一个使用此web服务的web客户端。我经历过尝试通过线路发送域对象的一些痛苦(循环引用、延迟加载等——参见示例)。因此,我将使用DTO在这两层之间进行传输 由于负责两端,我能够控制DTO的设计。现在我想知道,是什么驱动了DTO的设计?它是客户端的用户界面吗?我是否根据客户端将拥有的视图/屏幕创建DTO?或者是服务方应该规定我发送的DTO的合同,而客户端必须使用它所提供的内容?我认为在许多情况下,DTO模型没有域模型重要,因此我在这个问题上非常务实。我们编写的数

我正在编写一个web服务。我还在编写一个使用此web服务的web客户端。我经历过尝试通过线路发送域对象的一些痛苦(循环引用、延迟加载等——参见示例)。因此,我将使用DTO在这两层之间进行传输


由于负责两端,我能够控制DTO的设计。现在我想知道,是什么驱动了DTO的设计?它是客户端的用户界面吗?我是否根据客户端将拥有的视图/屏幕创建DTO?或者是服务方应该规定我发送的DTO的合同,而客户端必须使用它所提供的内容?

我认为在许多情况下,DTO模型没有域模型重要,因此我在这个问题上非常务实。我们编写的数据非常接近客户的实际需求,因为它是唯一的消费者。(有些进程调用服务器,它们使用不同的DTO。)对于数据的不同视图,甚至可能有不同的DTO。这就是DTO的力量


需要明确的是:它应该是由客户需求驱动的,而不是特定于客户的。例如,使用常规数据类型,而不是查看特定的数据类型。并非视图上的每一个更改(如UI设计更改)都会导致DTO的更改。这是可维护性的一般规则,没有什么特别之处。

设计DTO可能是一项艰巨的任务,特别是因为有许多问题需要考虑。通常,性能考虑因素会阻止您完全从UI抽象。假设同一对象有多个UI表示,例如树、网格和详细信息窗格。根据实际显示的内容,它们中的每一个都需要不同的属性子集。您可以设计一个公共DTO来包含所有这些属性的并集,但是构造这样的DTO、从存储中加载数据并通过线路传输数据可能会很昂贵。您可能会传输一个包含大量数据的富对象图,只是为了在UI中显示对象的名称

另一方面,如果您在每个UI上下文中使用DTO,那么很快就会遇到一个类爆炸问题,数百个DTO表示几乎相同的对象,而属性的子集稍有修改。代码的重用和可读性将受到影响,从长远来看,它可能变得难以管理

由于没有银弹,它需要一种敏感的方法,在性能和其他方面找到折衷点,每个域对象最多使用3种不同的DTO类型,并在不同的上下文中重用它们。

hejdig

当我不确定某个接口时,我通常首先编写调用方,因为这样我就有了使用该方法的上下文。这让我给了这个方法一个可以理解的名称,以及适合该方法用户的参数

/的

现在我想知道,是什么驱动了 DTO的设计

我个人认为,数据应该决定DTO的设计,它应该完全由DTO的目的驱动,即序列化。为此,我将使其成为一个具有简单get/set属性的完全平坦的数据结构。您最不希望做的事情是让表示层问题发挥作用,从而损害DTO(简单)用途的完整性