[英]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.