从单例模式重构为依赖注入
Refactoring from Singleton Pattern to Dependency Injection
我有一个 .NET Core 应用程序的代码,我在其中实现依赖注入设计模式。我在 ConfigureServices
方法中有两个单例调用。这两个调用非常相似;他们执行相似的方法,InitializeFirstClassClientInstanceAsync
和 InitializeSecondClassClientInstanceAsync
.
这两种方法在概念上非常相似,我想重构我的代码以结合这两种方法。但是,我找不到将 InitializeFirstClassClientInstanceAsync
和 InitializeSecondClassClientInstanceAsync
合并为一个 method/call 的技术。有没有办法将这两种方法合二为一。使用这种模式时甚至可能吗?
非常感谢您
下面是我的代码...
InitializeFirstClassClientInstanceAsync
和InitializeSecondClassClientInstanceAsync
初始化的实际调用:
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());
}
InitializeFirstClassClientInstanceAsync
和 InitializeSecondClassClientInstanceAsync
的主体是:
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;
}
我有一个 .NET Core 应用程序的代码,我在其中实现依赖注入设计模式。我在 ConfigureServices
方法中有两个单例调用。这两个调用非常相似;他们执行相似的方法,InitializeFirstClassClientInstanceAsync
和 InitializeSecondClassClientInstanceAsync
.
这两种方法在概念上非常相似,我想重构我的代码以结合这两种方法。但是,我找不到将 InitializeFirstClassClientInstanceAsync
和 InitializeSecondClassClientInstanceAsync
合并为一个 method/call 的技术。有没有办法将这两种方法合二为一。使用这种模式时甚至可能吗?
非常感谢您
下面是我的代码...
InitializeFirstClassClientInstanceAsync
和InitializeSecondClassClientInstanceAsync
初始化的实际调用:
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());
}
InitializeFirstClassClientInstanceAsync
和 InitializeSecondClassClientInstanceAsync
的主体是:
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;
}