使用 IConfiguration 构造函数将什么传递给 class?
What to pass to class with IConfiguration Constructor?
我有一个 class,其中包含一个使用一些数据库连接字符串的方法,而不是对它们进行硬编码,我想从我的 appsettings.json
文件中提取它们。因此,在其他拥有 done similar things 的人之后,我创建了一个带有 IConfiguration
参数的构造函数。我试图在 Blazor Page 的基础 class 中使用 SearchOfficer
方法,为此我尝试创建一个新的 Search 实例但无法弄清楚:我应该将什么传递给构造函数?
Class 方法:
public class Searches
{
private readonly IConfiguration _config;
public Searches(IConfiguration configuration)
{
_config = configuration;
}
public async Task<List<NameScore>> SearchOfficer(string Input)
{
//processy stuff
//Querying stuff
DataAccess data = new DataAccess();
string sql = "SELECT IdOfficer, Name FROM officers";
List<FirstLoadOfficer> Names = await data.LoadData<FirstLoadOfficer, dynamic>
(sql, new { }, _config.GetConnectionString("DataDB"));
//Sorting and Comparing stuff
return SortedNames;
}
}
我是如何尝试使用它的:
Searches searches = new Searches(/*what should I put here?*/);
SimilarPeople = await searches.SearchOfficer("Input Name");
避免注入 IConfiguration
(代码味道)。考虑在目标 class.
中显式注入实际需要的内容
您没有按照链接文章中显示的内容进行操作。
它建议创建一个模型来保存所需的信息,在这种情况下可能类似于
public class ConnectionStrings
public string DataDB { get; set; }
}
在启动时配置模型
//...
services.AddOptions();
//Configure Option using Extensions method
services.Configure<ConnectionStrings>(Configuration.GetSection("ConnectionStrings"));
//...
并通过依赖注入和选项模式重构目标 class 以依赖模型
public class Searches : ISearches {
private readonly ConnectionStrings connectionStrings;
public Searches(IOptions<ConnectionStrings> options) {
connectionStrings = options.Value;
}
public async Task<List<NameScore>> SearchOfficer(string Input) {
//processy stuff
//Querying stuff
DataAccess data = new DataAccess();
string sql = "SELECT IdOfficer, Name FROM officers";
List<FirstLoadOfficer> Names = await data
.LoadData<FirstLoadOfficer, dynamic>(sql, new { }, connectionStrings.DataDB);
//Sorting and Comparing stuff
return SortedNames;
}
}
理想情况下,目标 class 应该由抽象(接口)支持并注册
//...
services.AddScoped<ISearches, Searches>();
//...
有了这个,就是在需要的地方注入抽象
@inject ISearches searches
...
@code {
SimilarPeople = await searches.SearchOfficer("Input Name");
}
我有一个 class,其中包含一个使用一些数据库连接字符串的方法,而不是对它们进行硬编码,我想从我的 appsettings.json
文件中提取它们。因此,在其他拥有 done similar things 的人之后,我创建了一个带有 IConfiguration
参数的构造函数。我试图在 Blazor Page 的基础 class 中使用 SearchOfficer
方法,为此我尝试创建一个新的 Search 实例但无法弄清楚:我应该将什么传递给构造函数?
Class 方法:
public class Searches
{
private readonly IConfiguration _config;
public Searches(IConfiguration configuration)
{
_config = configuration;
}
public async Task<List<NameScore>> SearchOfficer(string Input)
{
//processy stuff
//Querying stuff
DataAccess data = new DataAccess();
string sql = "SELECT IdOfficer, Name FROM officers";
List<FirstLoadOfficer> Names = await data.LoadData<FirstLoadOfficer, dynamic>
(sql, new { }, _config.GetConnectionString("DataDB"));
//Sorting and Comparing stuff
return SortedNames;
}
}
我是如何尝试使用它的:
Searches searches = new Searches(/*what should I put here?*/);
SimilarPeople = await searches.SearchOfficer("Input Name");
避免注入 IConfiguration
(代码味道)。考虑在目标 class.
您没有按照链接文章中显示的内容进行操作。
它建议创建一个模型来保存所需的信息,在这种情况下可能类似于
public class ConnectionStrings
public string DataDB { get; set; }
}
在启动时配置模型
//...
services.AddOptions();
//Configure Option using Extensions method
services.Configure<ConnectionStrings>(Configuration.GetSection("ConnectionStrings"));
//...
并通过依赖注入和选项模式重构目标 class 以依赖模型
public class Searches : ISearches {
private readonly ConnectionStrings connectionStrings;
public Searches(IOptions<ConnectionStrings> options) {
connectionStrings = options.Value;
}
public async Task<List<NameScore>> SearchOfficer(string Input) {
//processy stuff
//Querying stuff
DataAccess data = new DataAccess();
string sql = "SELECT IdOfficer, Name FROM officers";
List<FirstLoadOfficer> Names = await data
.LoadData<FirstLoadOfficer, dynamic>(sql, new { }, connectionStrings.DataDB);
//Sorting and Comparing stuff
return SortedNames;
}
}
理想情况下,目标 class 应该由抽象(接口)支持并注册
//...
services.AddScoped<ISearches, Searches>();
//...
有了这个,就是在需要的地方注入抽象
@inject ISearches searches
...
@code {
SimilarPeople = await searches.SearchOfficer("Input Name");
}