2012-01-03 82 views
2

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

+1

小心不要过度工程。在知道性能问题之前,您不应该解决性能问题。否则,你可能会发现自己解决了错误的问题。 – 2012-01-03 16:32:19

+0

我还发现了一个[类似的问题](http://stackoverflow.com/q/1344066/122781)。 – HappyNomad 2013-11-18 12:33:17

回答

0

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

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

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

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

这个系统似乎在.NET和Java客户端代码中工作得很好。 Java客户端将其视为一个字符串数组。我们有一个用于.NET客户端的扩展方法库,可以更容易地填充数据。

0

你可以做的一件事是允许客户发送增量更新。你的所有对象都可以有一个唯一的指导,即服务器管理。

你可以有一个WCF方法,像这样送三角

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

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

+0

这种方法的问题在于,如果您有10个属性更改,则会发出10个服务呼叫。 – SliverNinja 2012-01-03 15:33:07

0

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