遍历F#中Azure存储类型提供程序生成的类型

时间:2017-05-19 11:08:03

标签: azure f# functional-programming type-providers

我试图了解F#中的类型提供者以及它们可以用于什么。我有以下问题:

我在Azure Blob存储中有一系列JSON对象存储如下:

container/YYYY/MM/DD/file.json

我可以使用类型提供程序轻松导航到给定日期的特定文件。例如,我可以将JSON对象作为5月5日的字符串访问

type Azure = AzureTypeProvider<"ConnectionString">
let containers  = Azure.Containers.``container``.``2017/``.``05/``.``05/``.``file.json``.Read()

如何获取用户输入日期字符串,例如&#34; 2017-05-05&#34;并以类型安全的方式获取相应的JSON对象?我应该使用类型提供商吗?

1 个答案:

答案 0 :(得分:6)

你遇到了一个常见的“问题”,它涉及许多TP的性质,特别是那些提供针对实际数据的模式的问题 - 因为它混合了数据和类型之间的界限,你需要注意何时你的'以一种适用于静态类型的模式工作(即,您在编译时知道正在使用的blob容器的模式),或者以一种本身动态的方式工作。

你有几个选择。

  1. 回归“原生”.NET SDK。每个blob /容器都有关联的AsCloudBlob()AsCloudContainer()方法,因此您可以将TP用于您知道的位,例如容器名称,可能是顶级文件夹等,然后回退到本机SDK中的弱类型位。

  2. 自TP的最新版本发布以来,现在支持以下几种方式进行编程访问: -

    • 您可以使用索引器获取blob的不安全句柄,例如let blob = Azure.Containers.container.["2017/05/05/file.json"]。无法保证blob存在,因此您需要自行检查等。

    • 您可以在幕后使用TryGetBlockBlob()方法返回blob option async,它会检查blob是否存在,然后返回None或Some斑点。

  3. 您可以查看所有这些替代方案的更多示例here

    1. 如果你事先知道你正在使用的完整路径(在编译时 - 可能是一些众所周知的路径等),你也可以使用TP中的offline support来创建一个明确的blob编译时的模式,无需真正的存储帐户。