在Breeze.js中投影时,避免每个结果的重复类型定义

时间:2014-02-21 16:23:41

标签: breeze

我目前正在使用投影查询实体以避免返回整个对象。 它运行完美无缺,但是,当查看服务器的实际响应时,我看到每个元素都重复相同的类型定义。

例如:

["$type":"_IB_4NdB_p8LiaC3WlWHHQ_pZzrAC_plF4[[System.Int32, mscorlib],[System.String, mscorlib],[System.String, mscorlib],[System.String, mscorlib],[System.Nullable`1[[System.Int32, mscorlib]], mscorlib],[System.Int32, mscorlib],[System.Single, mscorlib]], _IB_4NdB_p8LiaC3WlWHHQ_pZzrAC_plF4_IdeaBlade"

现在,假设结果中的每个项目都为该查询共享相同的投影,是否有办法让Breeze只定义类型描述ONCE而不是每个元素?

这可能看起来不是什么大问题但是随着结果大小的增加,这些字节确实开始累加起来。目前由于这种开销,返回预测值与整个实体本身之间几乎没有区别。

注意:事实证明,由于我们在真实环境中使用JSON的动态压缩,这实际上是一个小问题,因为200KB响应实际上变成了不到20KB的流量gzip压缩。可能会关闭这个问题,除非有人要添加一些可能对他人有用的东西。

2014年9月18日更新

我决定“解决”投影查询中的动态类型和为“Lookups”等端点创建的匿名类型的序列化数据中长丑陋$类型名称的问题。

有一个新的Breeze Labs nuget包,“Breeze.DynamicTypeRenaming”(搜索“Breeze Dynamic Type Renaming”)。这会将两个文件添加到Web API项目的“Controllers”文件夹中。一个是CustomBreezeConfig,它取代了Breeze的默认配置,并使用新的DynamicTypeRenamingSerializationBinder重置Json.Net“Binder”设置;这个绑定器的类型名称为magic。

只需在您的Web API项目中安装nuget包,它应该“正常工作”。在您的情况下,$ type值将变为"_IB_4NdB_p8LiaC3WlWHHQ_pZzrAC_plF4, Dynamic"

请参阅“DocCode”示例中的示例。

与往常一样,这是一款Breeze Lab产品,不是核心Breeze产品的一部分。它“按原样”提供,没有任何支持承诺。我很确定它很好并且没有不良的副作用。没有保证。如果有问题,我相信你会告诉我。

2 个答案:

答案 0 :(得分:2)

那太残忍了,不是吗!这是C#生成的匿名类型。您可以通过强制转换为自定义DTO类型来摆脱它。

我不知道它是否真的有害。无论如何,我讨厌看着它。

最近我一直在考虑添加JSON.NET IContractResolver来检测这些丑陋并将它们变成更短的uglies。不会很难。只是没有时间。

为什么不自己写下来并为社区做出贡献?我们将不胜感激! : - )

答案 1 :(得分:1)

使用JSON输出的动态压缩已经把这变成了一个非问题,至少现在是这样,因为所有重复的内容都是在服务器端严重压缩的。

相关问题