我正在使用Azure Functions,并希望将imperative binding用于我的Cosmos DB存储库。
首先,我在Run
- 方法:
[DocumentDB("TablesDB", "minified-urls", ConnectionStringSetting = "CosmosConnectionString", CreateIfNotExists = true)] out MinifiedUrl minifiedUrl,
这很有效。
但我宁愿使用命令式绑定,因此我可以动态定义绑定中使用的值。
我试过的第一件事就是这个,这不起作用,因为你需要设置ConnectionStringSetting
。
var output = await binder.BindAsync<MinifiedUrl>(new DocumentDBAttribute("TablesDB", "minified-urls"));
所以将这段绑定更改为以下内容应该有效,至少这是我的想法。
var output = await binder.BindAsync<MinifiedUrl>(new DocumentDBAttribute("TablesDB", "minified-urls")
{
CreateIfNotExists = true,
ConnectionStringSetting = "CosmosConnectionString"
});
当您执行此操作时,活页夹抱怨缺少Id
属性,如果您填写此Id
属性,则还需要设置PartitionKey
。
所以最后这就是我想出来的。
var output = await binder.BindAsync<MinifiedUrl>(new DocumentDBAttribute("TablesDB", "minified-urls")
{
CreateIfNotExists = true,
ConnectionStringSetting = "CosmosConnectionString",
Id = Guid.NewGuid().ToString(),
PartitionKey = DateTime.UtcNow.Year.ToString()
});
因为我想在存储库中创建一个新文档,所以绑定器无法找到某些内容,因此output
变量为null
。
那么,我想知道的是如何继续?声明性绑定工作正常,但我无法弄清楚如何使这个命令式工作。
答案 0 :(得分:3)
您的问题来自于运行时将您的命令式绑定解释为输入的问题。这是因为您要求自定义类型(MinifiedUrl
),因此从数据库中加载这个值是有意义的。
要制作绑定输出,您应该请求IAsyncCollector
类型,然后在其上调用AddAsync
:
var output = await binder.BindAsync<IAsyncCollector<MinifiedUrl>>(
new DocumentDBAttribute("TablesDB", "minified-urls")
{
CreateIfNotExists = true,
ConnectionStringSetting = "CosmosConnectionString"
});
await output.AddAsync(new MinifiedUrl(...));
答案 1 :(得分:0)
或者,甚至不打扰与文档Db的输出绑定。我发现输出绑定编程模型和API的功能远不如您要使用的服务的实际客户端sdk强大(在这种情况下为文档db)。
如果您设置Document db端点并设置您的应用程序设置键,则只需在Azure函数中实例化Document db客户端(您需要拥有Document db nuget),然后您就可以完全控制您要做的是不用担心笨拙的符号和输出绑定的属性。