[英]How to approach writing an F# type provider that enforces complex schema?
就在最近,我处理了一些流量和旅行信息数据,即Datex2格式的数据。 该项目时间不长,现在已经结束了,我继续像往常一样 ,使用xsd.exe工具生成了一堆强类型的C#类,进行了一些序列化,光处理等等。 然而,现在事后回想起来,我开始怀疑这对于F#类型的提供商来说是否是一个好例子,所以我第一次尝试这个问题。
考虑到这一点,如何处理一个不应经常改变的复杂模式的情况? 由于没有可直接从模式推断类型的公开类型提供程序,我猜选项是:
然后我也开始怀疑C#-F#故事(例如生成或擦除类型)以及如果我想修改类型以更好地检查约束,如<xs:element name="ilc" type="D2LogicalModel:TpegIlcPointDescriptor" maxOccurs="3">
在架构中<xs:element name="ilc" type="D2LogicalModel:TpegIlcPointDescriptor" maxOccurs="3">
同时还提供良好的开发人员体验。
滚动一个自己的类型看起来像一个相当laborius endavour和最后两个点似乎是最有吸引力的,所以服用的路线描述这里的号在另一个SO发布。 我使用System.Xml
和System.CodeDom
并修改代码以使用Microsoft.FSharp.Compiler.CodeDom
和FSharpCodeProvider
生成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.