2

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

当然,我可能并不总是保持联系。我可能在卫星连接中断的私人飞机上大发雷霆。

有没有人体验过构建一个“离线类型提供者”,它(以某种方式)将一个类型(来自一个类型提供者)作为输入,将其定义存储在磁盘上,并在以后为您提供所述类型定义以便在前往 Koh 的途中轻松访问帕岸?

由于类型不允许作为 TP 的参数,我正在考虑提供程序集名称 + 类型名称以脱机。

4

2 回答 2

2

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

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

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

Meta-provider - 我认为拥有 meta-provider 的想法非常酷 - 它应该在某种程度上起作用 - 您将能够缓存模式,但您可能无法缓存数据(也许是属性,但我猜方法行不通)。我认为应该可以将提供者的名称作为参数传递给您的元提供者。就像是:

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

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

于 2012-04-16T20:54:32.093 回答
2

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

于 2012-04-16T20:31:49.537 回答