繁体   English   中英

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

[英]How to approach writing an F# type provider that enforces complex schema?

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

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

  • 使用XML类型提供程序
  • 在这种情况下使用和外部工具xsd.exe生成类型 - 从WSDL类型提供程序 (使用svcutil.exe )获取提示。
  • 手动滚动类型(可能修改xsd.exe的输出)。
  • 生成类型(如前面的项目符号)/使用XML Type提供程序并在后台进行常量序列化,反序列化和模式验证。

然后我也开始怀疑C#-F#故事(例如生成或擦除类型)以及如果我想修改类型以更好地检查约束,如<xs:element name="ilc" type="D2LogicalModel:TpegIlcPointDescriptor" maxOccurs="3">在架构中<xs:element name="ilc" type="D2LogicalModel:TpegIlcPointDescriptor" maxOccurs="3">同时还提供良好的开发人员体验。

滚动一个自己的类型看起来像一个相当laborius endavour和最后两个点似乎是最有吸引力的,所以服用的路线描述这里在另一个SO发布。 我使用System.XmlSystem.CodeDom并修改代码以使用Microsoft.FSharp.Compiler.CodeDomFSharpCodeProvider生成F#类型。

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

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

<edit 2013-12-10: Rune FS正试图对此进行攻击,请参阅他提出的问题在提供的类型上获取编译错误

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM