簡體   English   中英

依賴注入和連接字符串/singleton 的多個實例

[英]Dependency Injection & connection strings / Multiple instances of a singleton

我有一個 Web Api 項目,它嚴重依賴於 Azure Cosmos DB。 到目前為止,擁有一個 Cosmos DB 帳戶(一個連接字符串)就足夠了。 現在一個新的要求是能夠根據傳入的參數連接到不同的 Cosmos(兩個連接字符串)。

對於 customerId X,我們應該從 Cosmos DB 1 獲取文檔,對於另一個客戶 Y,我們必須在 Cosmos DB 2 中查找。

到目前為止,我的 Startup.cs 文件注冊了 CosmosClient 的 singleton 實例。 反過來像這樣實例化 cosmosClient = new CosmosClient(endpointUrl, primaryKey); 這非常有效。 Web Api 能夠輕松處理所有請求。 但是現在我們必須為每個請求新建一個 CosmosClient,性能真的很差。

所以我的問題是; 有沒有辦法擁有相同 singleton 的多個實例? 如; 我們可以創建 Class+EndPointUrl 組合的單個實例嗎? (那仍然是 singleton 嗎?)

現在,我們每分鍾都在更新數千個 CosmosClients。 與我們之前的相比,我們真的只需要一個。

有多種方法可以做到這一點,但一個簡單的實現是圍繞您使用的每個CosmosClient創建一個包裝器。 包裝器的唯一用途是允許您使用CosmosClient的各種實例並通過它們的類型來區分它們。

//Create your own class for each client inheriting the behaviour of CosmosClient
public class ContosoCosmosClient : CosmosClient
{
    public ContosoCosmosClient(string connectionString, CosmosClientOptions clientOptions = null) : base(connectionString, clientOptions)
    {
    }

    public ContosoCosmosClient(string accountEndpoint, string authKeyOrResourceToken, CosmosClientOptions clientOptions = null) : base(accountEndpoint, authKeyOrResourceToken, clientOptions)
    {
    }

    public ContosoCosmosClient(string accountEndpoint, TokenCredential tokenCredential, CosmosClientOptions clientOptions = null) : base(accountEndpoint, tokenCredential, clientOptions)
    {
    }
}
//In Startup.up add a Singleton for each client
services.AddSingleton(new ContosoCosmosClient(...));
services.AddSingleton(new FabrikamCosmosClient(...));

然后在您的業務邏輯中,您可以添加兩個客戶端,並根據您的邏輯選擇要使用的客戶端:

public class MyService
{
    public MyService(ContosoCosmosClient contosoClient, FabrikamCosmosClient fabrikamClient)
    {
        //...
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM