【问题标题】:Update of large entity through service通过服务更新大实体
【发布时间】:2012-01-03 15:23:40
【问题描述】:

我们正在构建一个基于 WCF(但不是实体框架)的 n 层系统,并且我们已经讨论了实现大型实体更新的最佳方法。 当数据发送到客户端时,我们已经创建了 DTO 并将数据从我们的域模型映射到这些。 在我们当前的实现中,客户端然后进行一些更改并使用相同的 DTO 将它们发送回来。 我们的一些实体可能有 80-100 个属性,但也许客户只对其中的一个或几个进行更改。填充整个 DTO 并将其发回然后尝试在服务器端找出实际修改的属性似乎效率低下。 有没有更好的方法来实现这一点,还是我们应该使用“蛮力”方法? 将来我们需要支持非 .Net 客户端,因此我们不想将我们的解决方案绑定到特定于 .net 的东西上。

【问题讨论】:

  • 小心不要过度设计。在您知道存在性能问题之前,您不应该修复性能问题。否则,您可能会发现自己解决了错误的问题。
  • 我还找到了similar question

标签: wcf service dto


【解决方案1】:

我们通过在每个 DTO 上包含更改的属性名称的字符串数组来解决此问题。服务中的更新代码仅验证并写入名称在此数组中的属性。

为了使编码更容易,我们将这个字符串数组放在一个抽象基类中,并从中继承所有“可变”的 DTO。例如:

<DataContract>
Public MustInherit Class ChangeTrackableObject
    <DataMember> Public Property Changes As HashSet(Of String)
End Class

没有&lt;KnownType&gt; 属性,因为在这种情况下不需要DTO 多态性。 DataContractSerializer 只是利用继承关系拉入基类属性,仅此而已。

这个系统似乎同样适用于 .NET 和 Java 客户端代码。 Java 客户端将其视为字符串数组。我们有一个用于 .NET 客户端的扩展方法库,可以更轻松地填充数据。

【讨论】:

    【解决方案2】:

    您可以做的一件事是允许客户端发送增量更新。您的所有对象都可以具有服务器管理的唯一 guid。

    你可以有一个像这样的 WCF 方法来发送增量

      void UpdateProperty( Guid objguid ,
                string propertyname , string propertyvalue );
    

    在服务器端,您可以使用 guid 定位对象并更新相应的属性。

    【讨论】:

    • 这种方法的问题是,如果您有 10 次属性更改,您会进行 10 次服务调用。
    【解决方案3】:

    如果您的架构那么大,您可以尝试使用 XML 作为 Web 方法参数以及具有可选元素的 XSD。这不会与特定平台相关联。您可以只发送已更改的元素以及唯一键标识符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多