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

nih*_*il0 5 f# functional-programming azure type-providers

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

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

container/YYYY/MM/DD/file.json
Run Code Online (Sandbox Code Playgroud)

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

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

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

Isa*_*ham 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 blob.

您可以在此处查看所有这些替代方案的更多示例.

  1. 如果您事先知道正在使用的完整路径(在编译时 - 可能是一些众所周知的路径等),您还可以使用TP中的脱机支持在编译时创建显式blob模式,而无需一个真正的存储帐户.