【问题标题】:Maintaining Consistency Between JavaScript and C# Object Models保持 JavaScript 和 C# 对象模型之间的一致性
【发布时间】:2011-01-07 22:48:14
【问题描述】:

我正在开发一个 ASP.NET Web 应用程序,该应用程序在客户端使用大量 JavaScript,以允许用户执行拖放重新排序列表、查找要添加到列表的项目(如Google 搜索栏中的建议)、从列表中删除项目等。

我有一个 JavaScript“类”,用于在客户端存储每个列表项以及有关用户对项执行的操作(添加、编辑、删除、移动)的信息。页面发布到服务器的唯一时间是用户完成后,在提交页面之前,我将所有有关更改的信息序列化为 JSON 并将其存储在页面上的隐藏字段中。

我正在寻找的是一些关于如何在 C# 中构建我的类的一般建议。我认为在 C# 中拥有一个与 JavaScript 匹配的类可能会很好,这样我就可以将 JSON 取消实现为此类的实例。虽然服务器端的类都直接复制 JavaScript 类,而且只为支持 JavaScript UI 实现而存在,但这似乎有点奇怪。

这是一个抽象的问题。我只是在寻找其他在维护匹配的客户端和服务器端对象模型方面做过类似事情的人的指导。

【问题讨论】:

    标签: c# javascript schema schema-design relaxng


    【解决方案1】:

    非常有道理。如果我遇到这个问题,我会考虑使用数据类型或类的单一明确描述,然后根据该描述生成代码。

    描述可能是一个javascript源文件;您可以构建一个解析器,从该 JS 生成适当的 C# 代码。或者,它可能是一个 C# 源文件,您可以反过来。

    在 RelaxNG 中描述它,然后为 C# 和 Javascript 构建(或查找)生成器时,您可能会发现更多实用程序。在这种情况下,RelaxNG 模式将被检入源代码控制,而生成的工件不会。


    编辑:还有一个名为WADL 的新规范,我认为这在这方面也会有所帮助。我还没有评估 WADL。在外围,我知道它并没有席卷世界,但我不知道为什么会这样。 There's a question on SO regarding that.


    EDIT2:鉴于缺乏工具(WADL 显然是死胎),如果我是你,我可能会尝试这种战术方法:

    • 在您的 c# 类型上使用 [DataContract] 属性并将其视为确定的。
    • 构建一个工具,通过在示例 XML JSON 文档上使用 JsonSerializer,从已编译的程序集中获取 C# 类型并实例化该类型,该文档提供了一种事实上的“对象模型定义”。该工具应该以某种方式验证实例化类型是否可以往返转换为等效的 JSON,可能在结果内容上带有校验和或 CRC。
    • 将该工具作为构建过程的一部分运行。

    要实现这一点,您必须将该“示例 JSON 文档”签入源代码,并且您还必须确保 是您在各种应用程序中的 JS 代码。由于 Javascript 是动态的,您可能还需要一个类型验证器或其他东西,它将作为 jslint 或其他构建时验证步骤的一部分运行,它将检查您的 Javascript 源代码以查看它是否正在使用您的“标准”对象模型定义.

    【讨论】:

    • 谢谢,使用 RelaxNG 听起来是个有趣的想法。我最近一直在用 Google Protocol Buffers 做一些事情,它使用他们自己的语言来定义一个这样的类,这样你就可以为你正在编码的任何语言生成适当的版本。有趣的是如何应用这样的想法在多种不同的场景和技术中。我不敢相信我以前没想过这样做。
    • 是的,我也想到了 protobufs。我想知道从 protobufs .idl 生成的代码是否可以在没有 protobufs 序列化程序的情况下使用。如果是这样,您可以使用 .NET 中的 JsonSerializer,以及 protobufs 工具生成的 C# 代码。
    • 所以您建议我将 C# 类的序列化实例与包含表示我的数据结构的 JSON 的静态文档进行比较。如果它们匹配,那么我知道 C# 类是正确的。然后我会将 JavaScript 中相同类的实例与 JSON 文档进行比较,如果它们匹配,则验证我将能够在客户端到服务器之间来回交换数据,而不会出现序列化和反序列化问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多