使用依赖项注入时无法读取 AppSettings 值

AppSettings values cannot read when using dependency injection

首先,我是依赖注入的初学者。我正在尝试从我的 class

之一读取 appsettings.json 配置值

这是我的代码

private readonly IConfiguration _configuration;
public AdoExtract(IConfiguration configuration = null)
{
    _configuration = configuration;
}
public List<ApiAdoProject> ExtractAllWorkitems()
{
    List<ApiAdoProject> projects = new List<ApiAdoProject>();
    projects = GetAllProjects();
    return projects;
    //foreach (var prj in projects)
    //{
    //    string s = prj.name;
    //}
}

List<ApiAdoProject> GetAllProjects()
{
    Uri uri = new Uri("https://dev.azure.com/****");
    VssBasicCredential credentials =
        new VssBasicCredential("", _configuration["PAT"]);

    using (ProjectHttpClient projectHttpClient =
        new ProjectHttpClient(uri, credentials))
    {
        IEnumerable<TeamProjectReference> projects =
            projectHttpClient.GetProjects().Result;
    }
    return null;
}

当我 运行 这个 _configuration["PAT"] 返回 null

这是我的appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "PAT": "mypat",
  "ClientId": "567567567567546",
  "ClientSecret": "",
  "ConnectionStrings": {
    "EpmoDb": "mycd"
  }
}

这是我的创业公司

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

使用adocontroller的代码

namespace EPMO_Toolset_API.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AdoController : ControllerBase
    {
        private readonly IConfiguration _configuration;
        public AdoController(IConfiguration configuration = null)
        {
            _configuration = configuration;
        }
        // GET: api/<AdoController>
        [HttpGet]
        public List<ApiAdoProject> Get()
        {
            AdoExtract ado = new AdoExtract();
            return ado.ExtractAllWorkitems();
        }

我是不是漏掉了什么或者做错了什么

你不会这样做的:

AdoExtract ado = new AdoExtract();

因为它使用 null IConfiguration 运行 AdoExtract 构造函数,并且 AdoExtract 想要使用该配置,所以它不能为 null

您也许会做一些更像是将 IAdoExtract 注入控制器的事情:

public AdoController(IAdoExtract x)

并且已经在你的ConfigureServices中将IAdoExtract注册到AdoExtract,这意味着配置的实例将被使用,因为DI创建了AdoExtract,它看到它需要一个IConfiguration并且它知道如何提供它。如果您自己创建 AdoExtract,您将绕过它并改为提供空配置

    public void ConfigureServices(IServiceCollection services)
    {
        ...
        // decide a suitable lifetime eg Transient/Scoped etc
        services.AddScoped<IAdoExtract, AdoExtract>();
    }