使用 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");
}

引用ASP.NET Core Blazor dependency injection