簡體   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