我们正在构建一个基于WCF(但不是实体框架)的n层系统,并且我们讨论了实现大型实体更新的最佳方法。 当数据发送到客户端时,我们已经创建了DTO并将数据从我们的域模型映射到了它们。 然后,客户端在我们当前的实现中做出一些更改并使用相同的DTO将其发回。 我们的一些实体可能有80-100个属性,但也许客户端只会对其中的一个或几个进行更改。填充整个DTO并将其发送回去似乎效率不高,然后尝试在服务器端找出其实际修改的属性。 有没有更好的方法来实现这一点,或者我们应该采用“强力”方法吗? 未来我们需要支持非.Net客户端,所以我们不想将我们的解决方案与.net特定的东西联系起来。通过服务更新大型实体
2
A
回答
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。这不会绑定到特定的平台。您只需发送与唯一密钥标识符一起更改的元素即可。
相关问题
- 1. 通过DTO更新实体
- 2. Windows服务(413)请求实体过大
- 3. MVVM Ria服务。更新现有实体
- 4. 实体框架服务层更新POCO
- 5. 实体框架 - 通过属性更新
- 6. 通过实体框架更新
- 7. 通过EventListener更新Hibernate实体
- 8. 更新脚本通过实体框架
- 9. 如何从实体模型更新.Net域服务?
- 10. 如何通过RIA服务获得实体及其子实体
- 11. .NET Windows服务 - 通过服务重新启动获取更新
- 12. MVVM数据绑定模型通过服务更新时
- 13. EC2服务器,大量微型实例或更少的大型实例?
- 14. 允许通过REST Web服务通过更新服务的Rails 3
- 15. 通过Android更新服务器端文本文件通过Android
- 16. 更新实体通过ID使用瞬态的实例
- 17. 通过LINQ to SQL中的新对象更新实体
- 18. 如何仅通过EntityFramework更新实体的已更改属性
- 19. 与WCF服务通话时获取“413请求实体太大”
- 20. 实体框架:更新实体时更新另一个实体
- 21. 413实体过大的异常,WCF服务
- 22. 更新实体
- 23. WCF数据服务更新的实体错误和类型表的主键
- 24. 大型WCF服务的最佳实践?
- 25. 通过实体类型限制Azure TableQuery
- 26. 无法通过实体框架中的父级更新子实体
- 27. 实体框架4.1 RC(代码优先) - 实体没有通过关联更新
- 28. 通知用户新闻服务更新
- 29. 请求实体过大甚至可以更新的web.config
- 30. 当通过域服务(WCF RIA)加载实体时出现DomainOperationException
小心不要过度工程。在知道性能问题之前,您不应该解决性能问题。否则,你可能会发现自己解决了错误的问题。 – 2012-01-03 16:32:19
我还发现了一个[类似的问题](http://stackoverflow.com/q/1344066/122781)。 – HappyNomad 2013-11-18 12:33:17