作为客户端,在 ODataLib 和 WCF 数据服务(取决于 ODataLib)之间进行选择通常归结为对控制的需要。如果您的用例很简单并且您需要最常用的功能,那么 WCF DS 可能是一个不错的选择。如果您需要高级功能或精确控制有效负载的读取方式,ODataLib 可能是更好的选择。话虽如此,Vitek 已经在概念上涵盖了如何使用 ODataLib 读取服务操作。
WCF DS 将在 5.1 版中使阅读 JSON Light 变得更加容易。我将在本周的某个时候发布关于此的博客,但您引用的示例是您需要为此 RC 做的。在我放在一起的示例中只有一个新调用 - 调用context.Format.UseJson(Func<Uri,ModelResolverResult>)
. 让我们先谈谈为什么这个调用是必要的。OData(至少在 Microsoft 世界中)非常适合强类型。$metadata
是 OData 描述它正在使用的数据模型的一个很好的例子。对于Atom 有效负载甚至 JSON Verbose 有效负载,大部分类型信息都包含在有效负载中。使用 JSON Light 的目标是尽可能多地从“传输”有效负载中去除元数据。
如果元数据在带内不可用,则必须使其在带外可用。这是对 的调用签名背后的基本要求UseJson
。本质上,每当 WCF DS 需要元数据时,它都会查找给定 URI 的模型。如果它找不到那个模型,它最终会将元数据拨到满。我们想抢占它,因为它会使有效负载膨胀。我们可以通过提前告诉 WCF DS 如何解析模型来抢占它。这就是大多数样本正在做的事情。
从逻辑上遍历示例(是的,我知道可以进行许多其他优化 - 示例主要针对可读性进行了优化):
- 如果模型过去没有被解析
XmlReader
为调用构造一个新的EdmxReader.TryParse
- 为 out 参数命名一些值
EdmxReader.TryParse
- 调用
EdmxReader.TryParse
- 如果调用成功,将解析后的模型缓存在本地字典中(解析现在是一项昂贵的操作)
- 如果调用失败,将错误放在一起并抛出
- 从缓存的模型中获取正确的模型并将其返回到
ModelResolverResult
包装器中
希望这是有道理的。如果没有,我很想听听为什么,这样我才能使博客文章更清晰。请记住,当我们将这些位发布到生产环境时,这将变得更加简单。