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

2024-05-24

就在最近,我处理了一些交通和旅行信息的数据,即数据Datex2 http://www.datex2.eu/content/datex-ii-xml-schema-21格式。该项目时间不长,现在已经结束,我像往常一样继续生成了一堆强类型 C# 类xsd.exe http://msdn.microsoft.com/en-us/library/x6c1kb0s%28v=vs.110%29.aspx工具,做了一些序列化、轻处理等。然而,现在事后看来,我开始想知道这对于 F# 类型提供程序是否是一个很好的案例,因此我第一次尝试这个主题。

考虑到这一点,一个人应该如何处理存在以下情况的情况:复杂图式 http://www.datex2.eu/archived-document/35这不应该经常改变吗?由于没有公开可用的类型提供程序可以直接从架构推断类型,我想选项是:

  • Use the XML 类型提供者 http://fsharp.github.io/FSharp.Data/library/XmlProvider.html.
  • 使用外部工具生成类型,xsd.exe http://msdn.microsoft.com/en-us/library/x6c1kb0s%28v=vs.110%29.aspx在这种情况下——从WSDL 类型提供者 http://msdn.microsoft.com/en-us/library/vstudio/hh362328.aspx(它使用svcutil.exe http://msdn.microsoft.com/en-us/library/aa347733%28v=vs.110%29.aspx).
  • 手动滚动类型(可能会修改输出xsd.exe http://msdn.microsoft.com/en-us/library/x6c1kb0s%28v=vs.110%29.aspx).
  • 生成类型(如上一个项目符号所示)/使用 XML 类型提供程序并在后台进行持续的序列化、反序列化和架构验证。

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

滚动自己的类型看起来是一项相当费力的工作,最后两点似乎是最吸引人的,所以采取所描述的路线here https://stackoverflow.com/questions/4150164/programmatically-use-xsd-exe-tool-feature-generate-class-from-xsd-schema-throu by nos https://stackoverflow.com/users/126769/nos在另一个SO帖子中。我用了System.Xml and System.CodeDom并修改了代码以使用Microsoft.FSharp.Compiler.CodeDom and FSharpCodeProvider生成 F# 类型。

唉!生成的 F# 代码无法编译(即使在添加适当的引用等之后)。此时,我想我可以询问一些指示。

问题:如果我想在开发周期中尽早强制执行给定模式中描述的约束,是否有一种推荐的、有经验的方法来创建类型提供程序以符合稍微复杂的 XML 模式(以 Datex2 作为案例示例) ?

Rune FS https://stackoverflow.com/users/112407/rune-fs正在尝试对此进行尝试,请参阅他的SO问题在提供的类型上出现编译错误 https://stackoverflow.com/questions/20466880/getting-compile-error-on-provided-type.


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

至于 XML 类型提供程序,我们有一个工作项目 https://github.com/fsharp/FSharp.Data/issues/57添加对 XSD 的支持(这将是很好的社区贡献,因为它是相当独立的),所以如果我们有这样的支持,那么我相信使用 XML 类型提供程序将是完美的,因为您可以将 DATEX II 模式传递给它。

目前,F# Data 使用擦除类型(不利于 C# 互操作),但我们实际上正在考虑切换到生成类型,这将使​​提供程序可以从 C# 使用(通过小型 F# 项目) - 所以,我认为类型提供程序就是答案在这里,但它们可能需要一些改进才能完美适合您的项目(但是,F# Data 是一个开源项目,我们始终欢迎贡献:-))。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何编写强制执行复杂模式的 F# 类型提供程序? 的相关文章

  • 将 .NET P/Invoke 代码组织为 Win32 API 的最佳实践

    我正在 NET 中重构一个大型且复杂的代码库 该代码库大量使用 P Invoke to Win32 API 该项目的结构不是最好的 我发现 DllImport 语句遍布各处 经常为同一函数重复 并且还以多种方式声明 导入指令和方法有时声明为
  • 服务层设计。将事物放入服务层的原因

    我有一些与设计相关的问题 should service layer interfaces居住在一个domain layer 例如user service 将代码部分移动到单独层的主要原因是什么 should service layer居住在
  • 如何查找局域网中所有主机上正在运行的程序的所有实例?

    出于实际目的 SqlDataSourceEnumerator 的作用是查找在 LAN 上的各个 PC 上运行的 SQL Server 的所有实例 是否有等效的方法可以查找任意应用程序的运行实例 编辑 好的 所以这只有效 因为这些应用程序有预
  • IL 的仿制药?

    是否可以在 IL 生成器中使用泛型 DynamicMethod method new DynamicMethod GetStuff typeof int new Type typeof object ILGenerator il metho
  • 运行 t4 脚本作为 resx 文件的自定义工具

    我有一个资源文件MyResource resx 我想改变MyResource Designer cs文件生成 我有一个 t4 脚本 它接受 resx 文件作为输入并给出结果转换 但是 我必须手动运行此 t4 才能使其工作 我看到 resx
  • 如何动态加载包含非托管代码的原始程序集?(绕过“无法验证的代码失败策略检查”异常)

    我将举一个使用的例子系统 Data SQLite DLL http sqlite phxsoftware com 这是一个包含非托管代码的混合程序集 如果我执行这个 var assembly Assembly LoadFrom System
  • 使用异步工作流程并行化的最佳实践

    假设我想抓取一个网页并提取一些数据 我很可能会写这样的东西 let getAllHyperlinks url string async let req WebRequest Create url let rsp req GetRespons
  • 使用部分函数短路列表映射

    因此 我创建了一个名为 tryMap 的函数 如下所示 tryMap with failure and success continuations let rec tryMapC R gt U list gt R gt T gt U opt
  • ASP.NET MVC 中 ModelState.AddModelError 中的关键参数有什么意义?

    我在我的控制器中添加了验证检查来修改ModelState如果验证失败 例如 private bool ValidateMoney string raw string name decimal min decimal max try var
  • 该组件没有由 uri 标识的资源

    我想创建一个通用数据网格以在我的所有视图 用户控件上使用 这是我的结构 Class Library called Core Class called ViewBase public class ViewBase UserControl pu
  • 解决找不到程序集的问题 |文件未找到异常 |融合日志

    我正在尝试将我的解决方案包 wsp 部署到 SharePoint 2007 环境 WSP 包含一个功能 该功能加载功能接收器类以在运行时部署计时器作业 在部署此 WSP 时 我不断得到 特征 fb631f6c 2c46 4ab5 b7b3
  • 如何让 LinqToSql 将“索引提示”传递给 sql server?

    由于我们不能相信我们的客户会更新 sql server 中的索引统计信息等 因此我们过去不得不使用索引提示 http www sql server performance com tips hints general p1 aspx 由于我
  • 有谁知道一种更快的方法来执行 String.Split() 吗?

    我正在读取 CSV 文件的每一行 并且需要获取每一列中的各个值 所以现在我只是使用 values line Split delimiter where line是保存由分隔符分隔的值的字符串 衡量我的表现ReadNextRow我注意到它花费
  • 如何在 VS2017/2015 中打开 .xproj 文件

    我有一个带有扩展名的 NET core 项目 xproj 当我在VS 2017中打开项目时 项目文件 xproj migrated to csproj 如何打开 xproj 文件 Visual Studio 2017 2015 我需要安装任
  • 如何在 F# 中执行 Seq.takeWhile + 一项

    我想编写一个使用谓词过滤序列的函数 但结果还应该包括谓词返回 false 的第一个项目 如果 F 中有一个break关键字 逻辑将是这样的 let myFilter predicate s seq for item in s do yiel
  • 如何等待远程 .NET 调试器连接

    今天我遇到了一个问题 我需要远程调试程序 该程序是从另一个系统启动的 所以我真的没有机会在命令行上与它交互 不过我可以很容易地改变它的来源 我需要做的是让程序正常启动 然后等待我用调试器附加到它 我想不出一个让我快乐的方法 我确实发现了这个
  • .NET“默认行终止符”?

    有什么方法可以弄清楚 NET 使用什么作为其 默认行终止符 例如 StringBuilder AppendLine String 的文档表示 附加指定字符串的副本 后跟默认行终止符 NET 中的几个与文本相关的类引用相同的概念 有什么方法可
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • VB.NET 中的静态方法实现

    我很困惑Static在 VB NET 中的实现 在 C 中 我们可以创建静态类和静态方法来为我们的应用程序编写实用方法 现在 VB NET 让我们创建Module代替静态类 如果我们在模块中创建一个方法 默认情况下它会变成静态的 但在我的应
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org

随机推荐