【问题标题】:How to create and detect changes in sparse DTOs?如何创建和检测稀疏 DTO 的变化?
【发布时间】:2013-04-05 15:31:28
【问题描述】:

我正在开发一些由利用实体框架的 DAL 支持的 WCF 服务。客户端、服务和 DAL 通过数据传输对象 (DTO) 以 WCF 数据合同的形式相互通信。 (来自 EF 的 Entity 对象被封装在 DAL 中)。

为了尽量减少网络上的数据量,我想支持稀疏 DTO 的传输——对象中总字段的子集。

例如,假设我有这样的 DTO:

public class widget
{
   public string ID { get; set; }
   public string Name { get; set: }
   public int Amount { get; set; }
   public string Color { get; set; }
}

说对象的原始状态是:

ID = "xxx"
Name = "flux capacitor"
Amount = 42
Color = "purple"

现在,客户端可能想要显示系统中所有小部件的列表,因此向服务请求所有小部件的列表,但只请求IDName 字段。

第一个问题:在这种情况下如何向客户端发送稀疏 DTO?我知道 DataMembers 在 DataContracts 中是可选的,但我不确定初始化它的代码是什么样的。只需填写要求的字段?

现在假设 UI 中的 Name 字段是可编辑的,并且用户更改了 xxx 小部件的名称。客户端通过发送的服务触发更新:

ID = "xxx"
Name = "a new name"

此时,我希望能够检测到只有 Name 字段发生了变化,并触发 DAL 中实体的更新。 下一个问题是:我怎么知道客户端发送了一个 DTO,其中只指定了 IDName 字段?

【问题讨论】:

  • ...我已经考虑过跟踪发出的 DTO 的方法,因此我可以比较返回系统的 DTO。只是不确定如何处理未指定的字段。我不想为未指定的Color 字段取回一个空字符串,然后用空字符串值更新数据库...

标签: .net wcf entity-framework dto


【解决方案1】:

我决定做的是为所有原始字段创建具有可为空类型的 DTO。这样,当 DTO 来自客户端请求时,代码可以检查 NULL。如果为 NULL,则客户端未指定该字段。否则,从 EF 获取值并将其设置在 Entity 实例上,然后让数据库上下文找出发生了什么变化...

【讨论】:

  • 最好不要过度使用 DTO。它通常会导致各种问题:过度使用的 DTO 增长(因为有人只需要一个字段 :D ),用于相同目的的不同字段,有些人甚至会将 List 更改为 List (因此它开始包含不同类型的对象并产生更大的混乱)等等
猜你喜欢
  • 2017-03-31
  • 2019-02-10
  • 2017-12-16
  • 2014-10-03
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多