嵌套类型提供程序

时间:2012-04-16 20:25:00

标签: f# nested type-providers

我有一个类型提供程序连接到网络以检索数据。 并通过类型提供者机制生成(我们称之为虚构)'静态类型'。

当然,我可能并不总是联系在一起。我可能正乘着私人飞机闯入卫星连接。

有没有人有经验构建一个“离线类型提供者”,它以某种方式(来自类型提供者)作为输入,将其定义存储在磁盘上,并在以后为您提供所述类型定义,以便您在去帕岸岛的路?

由于类型不允许作为TP的参数,我在考虑提供汇编名称+类型名称以便脱机。

2 个答案:

答案 0 :(得分:2)

您可以增强原始类型提供程序,使其在联机和脱机模式下均可使用。即如果成功的模式缓存在磁盘上(提供者可以理解的某种格式),提供程序会尝试连接到数据源并获取模式。在该提供程序使用磁盘上的架构信息公开类型之后。如果由于某种原因,与数据源的连接不可用 - 提供程序检查是否存在缓存模式,如果存在,则使用它。例如,标准类型提供程序(LINQ2SQL或EF)允许您指定在无法直接连接到数据库时可以使用的模式文件。

答案 1 :(得分:2)

这是编写F#类型提供程序的一个棘手问题。但我认为主要的问题是,当您使用私人飞机进行开发并且使用类型提供程序访问某些外部数据源时,您将无法访问数据

架构缓存 - 如果类型提供程序支持某种形式的模式缓存(即通过将模式存储在XML文件中,如@desco提到的LINQ to SQL),那么您将能够编写一些代码并对其进行编译,但您仍然不会能够测试代码。我认为这使得架构缓存对于私人飞机场景不那么有用。但是,在无法访问模式的构建服务器上构建代码的情况下,它非常有用。

本地数据 - 对于私人飞机场景,您可能需要某种本地数据(或子集),以便能够实际测试您编写的代码,然后您可以经常指出本地副本的类型提供程序(数据库,CSV或XML文件等)。

元提供程序 - 我认为使用元提供程序的想法非常酷 - 它应该在某种程度上起作用 - 您可以缓存模式,但您可能不会能够缓存数据(也许是属性的值,但我猜方法不起作用)。我认为应该可以将提供者的名称传递给mock作为元提供者的参数。类似的东西:

type CachedDB = 
  SchemaCachingProvider<"FSharp.Data.TypeProviders.dll", "SqlDataConnection", "..">

我不知道有什么计划做这样的事情,但是如果你开始了,我确信FSharpX人会对它有兴趣: - )。