就在最近,我处理了一些流量和旅行信息数据,即Datex2格式的数据。该项目时间不长,现在已经结束了,我继续像往常一样,用xsd.exe工具生成了一堆强类型的C#类,做了一些序列化,光处理等等。然而,现在事后回想起来,我开始怀疑这对于F#类型的提供商来说是否是一个很好的例子,所以我首先要抓住这个主题。
考虑到这一点,我们应该如何处理一个不应经常变化的complex schema的情况?由于没有可直接从模式推断类型的公开类型提供程序,我猜选项是:
然后我也开始怀疑C#-F#故事(例如生成或删除的类型)以及如果我想修改类型以更好地检查模式中的<xs:element name="ilc" type="D2LogicalModel:TpegIlcPointDescriptor" maxOccurs="3">
等约束同时还提供一个好的开发人员该怎么办?经验。
滚动一个人自己的类型看起来像是一个相当劳动的结果,最后两个点似乎是最吸引人的,所以在另一个SO帖子中按here nos描述的路线。我使用了System.Xml
和System.CodeDom
并修改了代码以使用Microsoft.FSharp.Compiler.CodeDom
和FSharpCodeProvider
来生成F#类型。
唉!生成的F#代码无法编译(即使添加了适当的引用后等)。此时我认为我可以问一些方向。
问题:如果我想强制执行约束,是否有一种建议的,经验支持的方式来创建类型提供程序以符合稍微复杂的XML模式(以Datex2为例)在开发周期中尽早在给定的模式中?
&lt; edit 2013-12-10: Rune FS正在尝试对此进行抨击,请参阅他的问题Getting compile error on provided type。
答案 0 :(得分:5)
这是一个非常复杂的问题,我想没有简单的答案 - 我想你可能列举了所有选项以及他们的大部分权衡。对于一次性项目,仅为一个目的构建特定类型提供程序没有任何意义,因此我认为使用XML提供程序或代码生成是唯一的选择。代码生成(修改生成的代码时)是维护的噩梦。
对于XML类型提供程序,我们有一个work item来添加对XSD的支持(这将是很好的社区贡献,因为它非常独立),所以如果我们有,那么我相信使用XML类型提供程序将是完美的,因为您可以将它传递给DATEX II架构。
目前,F#Data使用已擦除的类型(对C#interop不利)但我们实际上正在考虑切换到生成的类型,这将使提供者可以从C#(通过小型F#项目)使用 - 所以,我认为类型提供者这里是答案,但他们可能需要一些改进才能完成你的项目(但是,F#Data是一个开源项目,我们总是欢迎贡献: - ))。