从单例模式重构为依赖注入

Refactoring from Singleton Pattern to Dependency Injection

我有一个 .NET Core 应用程序的代码,我在其中实现依赖注入设计模式。我在 ConfigureServices 方法中有两个单例调用。这两个调用非常相似;他们执行相似的方法,InitializeFirstClassClientInstanceAsyncInitializeSecondClassClientInstanceAsync.

这两种方法在概念上非常相似,我想重构我的代码以结合这两种方法。但是,我找不到将 InitializeFirstClassClientInstanceAsyncInitializeSecondClassClientInstanceAsync 合并为一个 method/call 的技术。有没有办法将这两种方法合二为一。使用这种模式时甚至可能吗?

非常感谢您

下面是我的代码...

InitializeFirstClassClientInstanceAsyncInitializeSecondClassClientInstanceAsync初始化的实际调用:

public void ConfigureServices(IServiceCollection services)
{
    .............
    //add classes to register query classes with DI container
    services.AddSingleton<IFirstClassQueries>(
        provider => InitializeFirstClassClientInstanceAsync(
            provider.GetService<MyClient>()).GetAwaiter().GetResult());

    services.AddSingleton<ISecondClassQueries>(
        provider => InitializeSecondClassClientInstanceAsync(
            provider.GetService<MyClient>()).GetAwaiter().GetResult());
}

InitializeFirstClassClientInstanceAsyncInitializeSecondClassClientInstanceAsync 的主体是:

private static async Task<IFirstClassQueries>
    InitializeFirstClassClientInstanceAsync(DaprClient daprClient)
{
    string databaseName = "databasename";
    string containerName = "containername";
    string accountUri = "https://localhost";
    var key = GetSecret();
    DBClient client = new DBClient(accountUri, key["mykey"]);
    NotificationQueries queryService =
        new NotificationQueries(client, databaseName, containerName);
    return queryService;
}

private static async Task<ISecondClassQueries>
    InitializeSecondClassClientInstanceAsync(DaprClient daprClient)
{
    string databaseName = "databasename";
    string containerName = "containername";
    string accountUri = "https://localhost";
    var key = GetSecret();
    DBClient client = new DBClient(accountUri, key["mykey"]);            
    UserAvailabilityQueries queryService =
        new UserAvailabilityQueries(client, databaseName, containerName);
    return queryService;
}        

找到了我们可以接受的解决方案

调用初始化

    public void ConfigureServices(IServiceCollection services)
    {
        ...................................
        //add classes to register query classes with DI container
        services.AddSingleton<CosmosClient>(provider => InitializeCosmosClientAsync(provider.GetService<DaprClient>()).GetAwaiter().GetResult());
        services.AddSingleton<IFirstClassQueries, NotificationQueries>();
        services.AddSingleton<ISecondClassQueries, UserAvailabilityQueries>();
    }

正文 InitializeCosmosClientAsync

    private static async Task<CosmosClient> InitializeCosmosClientAsync(DaprClient daprClient)
    {
        var accountUri = await GetAccountUri();
        var key = await GetKey();
        CosmosClient client = new CosmosClient(accountUri, key);
        return client;
    }