我知道如何将查询直接绑定到Azure函数并在函数中使用Cosmos DB触发器。
但是,我正在寻找直接使用DocumentClient
(Nuget软件包Microsoft.Azure.Cosmos
)的方向。
DocumentClient
来获得[DocumentDB("test", "test", ConnectionStringSetting = "CosmosDB")] DocumentClient client
实例作为绑定。DocumentClient
中创建一个var client = new DocumentClient(...)
实例。我找不到明确的建议,何时使用哪种方法,除了3永远不是一个好选择,因为性能,内存使用情况和连接限制。另外,我知道使用静态实例也有好处。
问题
DocumentClient
并在函数主体中创建查询相比,绑定到SQL查询有什么优势?答案 0 :(得分:1)
This article对于静态客户端来说是一个很好的例子。
我们都知道HttpClient使用这种方法的麻烦(如果您 请勿,请在本文后立即阅读!),它的确切内容 同样的效果在这里:如果函数的音量很大 触发因素,我们不仅会惩罚我们的表现 数据库调用具有初始化开销,但有内存 消耗会增加,甚至可能导致插槽耗尽 场景。
对于问题2和3: 使用绑定的最大好处是简单。客户等的所有创建都从您那里抽象出来。缺点当然是控制。 Here是使用自定义客户端的一个很好的例子。
使用SQL查询代替DocumentClient是抽象方面的又一步。
答案 1 :(得分:1)
还有另一种使用DocumentClient的方法。 从Microsoft.NET.Sdk.Functions的1.0.28版本开始,现在可以使用FunctionsStartup类初始化一次DocumentClient,然后将其注册为DI(依赖注入),然后每次都使用相同的实例。
FunctionsStartup类已记录在here中。更好的解释是here。
在“启动”的configure方法中,构建客户端。
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
[assembly: FunctionsStartup(typeof(MyApp.Startup))]
namespace MyApp
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
IDocumentClient client = GetCustomClient();
builder.Services.AddSingleton<IDocumentClient>(client);
}
}
然后可以将其注入到函数构造函数中并由方法使用。
public class MyFunction
{
private IDocumentClient _client;
public MyFunction(IDocumentClient client)
{
_client = client;
}
[FunctionName("MyFunction")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
// use _client here.
}
}
Azure创建此类的实例来处理请求时,它将传递在FunctionsStartup类中创建的IDocumentClient实例。
此策略允许重用同一DocumentClient实例。通过静态设置此客户端不是强制性的,而是通过确保我们仅创建一次即可。这也有助于提高可测试性,因为测试可以注入其他IDocumentClient实例。