如何编写强制复杂模式的F#类型提供程序?

时间:2013-11-16 21:57:25

标签: .net f# xsd type-providers

就在最近,我处理了一些流量和旅行信息数据,即Datex2格式的数据。该项目时间不长,现在已经结束了,我继续像往常一样,用xsd.exe工具生成了一堆强类型的C#类,做了一些序列化,光处理等等。然而,现在事后回想起来,我开始怀疑这对于F#类型的提供商来说是否是一个很好的例子,所以我首先要抓住这个主题。

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

  • 使用XML type provider
  • 使用外部工具生成类型,在这种情况下为xsd.exe - 从WSDL type provider(使用svcutil.exe)中获取提示。
  • 手动滚动类型(可能修改xsd.exe的输出)。
  • 生成类型(如上一篇文章中所述)/使用XML Type提供程序,并在后台进行常量序列化,反序列化和模式验证。

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

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

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

问题:如果我想强制执行约束,是否有一种建议的,经验支持的方式来创建类型提供程序以符合稍微复杂的XML模式(以Datex2为例)在开发周期中尽早在给定的模式中?

&lt; edit 2013-12-10: Rune FS正在尝试对此进行抨击,请参阅他的问题Getting compile error on provided type

1 个答案:

答案 0 :(得分:5)

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

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

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