使用依赖项注入时无法读取 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>();
}
首先,我是依赖注入的初学者。我正在尝试从我的 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>();
}