通过服务更新大型实体

时间:2012-01-03 15:23:40

标签: wcf service dto

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

3 个答案:

答案 0 :(得分:0)

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

您可以使用类似的WCF方法发送增量

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

没有<KnownType>属性,因为在这种情况下不需要DTO多态性。 DataContractSerializer只使用继承关系来引入基类属性,仅此而已。

这个系统似乎与.NET和Java客户端代码同样有效。 Java客户端将此视为字符串数组。我们有一个.NET客户端扩展方法库,可以更容易地填充数据。