C# Cosmos SDK3容器可以是一个单件吗?

C# Cosmos SDK3容器可以是一个单件吗?,c#,azure-cosmosdb,azure-cosmosdb-sqlapi,C#,Azure Cosmosdb,Azure Cosmosdb Sqlapi,我想减少Azure Cosmos DB SQL-API的负载,它是通过依赖项注入从.NET核心Web API调用的 在App Insights中,我注意到每次调用Web API都会导致对Cosmos的GetDatabase和GetCollection调用,当Cosmos负载较重时,这些调用可能需要5秒才能运行 我已经制作了CosmosClienta singleton(例如这里的建议-) 但是,对于数据库或容器对象是否也可以是单例对象,我找不到任何建议,因此这些对象是为Web API的每个请求创

我想减少Azure Cosmos DB SQL-API的负载,它是通过依赖项注入从.NET核心Web API调用的

在App Insights中,我注意到每次调用Web API都会导致对Cosmos的GetDatabase和GetCollection调用,当Cosmos负载较重时,这些调用可能需要5秒才能运行

我已经制作了
CosmosClient
a singleton(例如这里的建议-)

但是,对于
数据库
容器
对象是否也可以是单例对象,我找不到任何建议,因此这些对象是为Web API的每个请求创建的

我检查数据库和集合是否存在(例如,此处和以下建议)

这意味着对于Web API的每个请求,都会运行以下代码

var databaseResponse = await this.cosmosClient.CreateDatabaseIfNotExistsAsync(
    this.databaseConfiguration.DatabaseName,
    throughput: this.databaseConfiguration.DatabaseLevelThroughput);
var database = databaseResponse.Database;
var containerResponse = await database.CreateContainerIfNotExistsAsync(containerId, partitionKey);
var container = containerResponse.Container;

我是否可以创建
数据库
容器
单例,并将它们添加到要注入的DI中,就像
CosmosClient
一样,以减少在App Insights中看到的对GetDatabase和GetCollection的调用次数?

CreateDatabaseIfNoteExistsAsync
应该只调用一次,因为这只是DB的一个设置步骤配置


您最好创建一个DbService来持久化容器对象。并将DbService注入到每个服务中,而不是DB客户端

您不需要每次调用
CreateIfNotExistsAsync
,如果您知道它们可用,您可以使用
CosmosClient.GetContainer(dbName,containerName)
,这是一个轻量级代理类


除非您希望在某个时刻动态删除数据库和容器?

是否可以像
CosmosClient
那样在应用程序的生命周期内保留
CosmosClient.GetContainer(dbName,containerName
返回的
容器
实例?例如,我将Cosmos
容器
包装在“储存库"类。在此存储库类中,
容器
在第一次使用时被延迟实例化。如果存储库类是单实例,那么,
容器
实例将在应用程序的生命周期内存在,并由多个线程访问。这是否会导致问题。例如,
容器
实例是否像一样线程安全ode>CosmosClient是的,
Container
实例只是一个代理,仅此而已。调用
GetContainer
时没有开销或网络调用,因此您可以保留一个实例,这将是线程安全的。Hi,关于此主题,还讨论了github,似乎容器可以作为单例保存—而不是ks-我很想这样做。但是我找不到任何关于在应用程序的生命周期内保存
容器是否安全的文档(与
CosmosClient
不同,在那里,文档说可以)。您知道在应用程序和线程安全期间保存
容器
实例是否安全吗?在示例repo:,作者在每个查询中初始化了一个新的客户端中找到了一个具有cosmos DB:,用于存储库模式的文档…我不知道这是否是一个好的做法。或者,我误解了示例repo。他们保留IDocumentCl客户端对象,并用DB客户端包装它。也许您可以将代码作为参考来阅读