【问题标题】:How to approach writing an F# type provider that enforces complex schema?如何编写强制执行复杂架构的 F# 类型提供程序?
【发布时间】:2013-11-16 21:57:25
【问题描述】:

就在最近,我处理了一些交通和旅行信息数据,即Datex2 格式的数据。项目时间不长,现在就结束了,我像往常一样继续使用xsd.exe 工具生成了一堆强类型C# 类,进行了一些序列化、轻量级处理等等。然而,事后看来,我开始怀疑这对于 F# 类型的提供程序是否是一个很好的案例,所以我第一次尝试这个主题。

考虑到这一点,应该如何处理不应该经常更改的complex schema 的情况?由于没有公开可用的类型提供程序可以直接从模式中推断类型,我猜这些选项是:

  • 使用XML type provider
  • 使用外部工具生成类型,在本例中为xsd.exe——从WSDL type provider(使用svcutil.exe)中获取线索。
  • 手动滚动类型(可能修改xsd.exe的输出)。
  • 生成类型(如上一个项目)/使用 XML 类型提供程序并在后台进行持续序列化、反序列化和架构验证。

然后我也开始想知道 C#-F# 的故事(例如生成或删除的类型),如果我想修改类型以更好地检查模式中的 <xs:element name="ilc" type="D2LogicalModel:TpegIlcPointDescriptor" maxOccurs="3"> 等约束,同时还能提供良好的开发人员体验,该怎么办。

滚动自己的类型看起来像是一项相当费力的工作,最后两点似乎是最吸引人的一点,所以采取nos 在另一篇 SO 帖子中描述的here 的路线。我使用了System.XmlSystem.CodeDom 并修改了代码以使用Microsoft.FSharp.Compiler.CodeDomFSharpCodeProvider 来生成F# 类型。

唉!生成的 F# 代码无法编译(即使在添加了适当的引用等之后)。此时我想我可以问一些方向。

问题:如果我想按照所述强制实施约束,是否有推荐的、有经验的方法来创建类型提供程序以符合有点复杂的 XML 模式(以 Datex2 为例)在开发周期中尽早使用给定架构?

Rune FS 正试图对此进行尝试,请参阅他的 SO 问题 Getting compile error on provided type

【问题讨论】:

    标签: .net f# xsd type-providers


    【解决方案1】:

    这是一个相当复杂的问题,我想没有简单的答案 - 我想您可能列举了所有选项以及它们的大部分权衡。对于一次性项目,仅仅为了单一目的而构建特定类型的提供程序并没有什么意义,所以我认为使用 XML 提供程序或代码生成是唯一的选择。代码生成(修改生成的代码时)是维护的噩梦。

    至于 XML 类型提供程序,我们有一个 work item 来添加对 XSD 的支持(这将是一个很好的社区贡献,因为它非常独立),所以如果我们有,那么我相信使用 XML 类型provider 将是完美的,因为您可以将 DATEX II 模式传递给它。

    目前,F# Data 使用已擦除类型(对 C# 互操作不利),但我们实际上正在考虑切换到生成类型,这将使​​提供程序可从 C# 使用(通过小型 F# 项目) - 所以,我认为类型提供程序是这里的答案,但它们可能需要一些改进才能完美适合您的项目(但是,F# Data 是一个开源项目,我们始终欢迎贡献:-))。

    【讨论】:

    • 是的,这个问题似乎相当复杂。最初我希望我可以(反)序列化 XML 片段并使用 System.Xml.Schema 进行检查,但是,不,看起来那里会有太麻烦的边缘情况......无论如何,我肯定不能领导这个任务,我是一个相当新手的 F# 家伙。最多我可以在人行道上喋喋不休地发表意见(是的,谈话很便宜:))并帮助测试和有人可以指出的“简单”的东西。感谢您的 GitHub 指针,如果我将来能提供帮助,我会密切关注!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多