在我的应用程序中,我正在进行服务调用并返回填充的WCF数据协定对象。我必须在网格中显示这些数据。将数据协定绑定到网格是一种好习惯吗?
约什
答案 0 :(得分:10)
将数据合同绑定到网格是一种好习惯吗?
是。你正在做的事情没有错。
让我详细说明:您从WCF服务收到的内容是标准对象(有时称为 DTO - D
ata T
ransfer {{1 }} bject)。您不收到了DataContract - 您收到了一个使用 DataContract来控制WCF服务和客户端之间的序列化过程的对象。 DataContract可以控制或指示你得到的东西,但是一旦你有了这个对象,你可以随意对待它。
答案 1 :(得分:2)
假设您的所有DTO都对数据绑定友好,那么就不应该将WCF DTO绑定到网格时出现问题。
您可能不想直接绑定到DTO的一些情况是:
您的DTO不容易与其当前定义绑定(例如嵌套对象/属性)
您需要支持绑定客户端更改通知(通常使用INotifyPropertyChanged
完成)
您希望将UI代码与WCF DTO的更改隔离开来。这可能是因为您没有控制DTO定义,或者您希望频繁更改DTO定义,并且您不希望经常更改UI代码。当然,如果DTO确实发生了变化,那么您将不得不修改代码,但是您可以将这些更改隔离到一个小的转换层。
答案 2 :(得分:0)
我建议在服务器端(即MVC)和客户端(javascrip)渲染中使用视图模型进行任何数据绑定或数据显示(MVVM)。
使用域返回的DTO的主要风险是,如果DTO因任何原因而被重构(即属性被重命名,提取到其他对象或更多对象合并为一个),UI将会中断并需要更新。
DTO是您的域返回的合同,而视图模型是UI所需内容的合同。这两个要求由不同的要求控制,虽然这些要求可以应用于同一组对象,但结果通常是错误的混合,更不用说仅适用于UI或域的要求将触发另一方的变更
即。视图通常需要来自更多DTO的数据,或者不同的视图需要来自同一DTO的不同数据子集,并且在这两种情况下,DTO不应仅仅为了适应具体视图所需而改变。
如果视图具有视图模型,则更容易识别视图的要求,而不是将相同的DTO传递给更多视图。