Asp.net core IConfiguration对象为空。
我正在尝试从Asp.net core IConfiguration对象为空。,asp.net-core,asp.net-core-2.0,Asp.net Core,Asp.net Core 2.0,我正在尝试从appsettings.json读取连接字符串,我正在使用: services.AddSingleton(Configuration); 启动时的这一行抛出null。我是core2.0的新手。有人能告诉我我错过了什么吗 我的创业: public class Startup { public static string ConnectionString { get; private set; } public IConfiguration Configuration
appsettings.json
读取连接字符串,我正在使用:
services.AddSingleton(Configuration);
启动时的这一行抛出null。我是core2.0的新手。有人能告诉我我错过了什么吗
我的创业:
public class Startup
{
public static string ConnectionString { get; private set; }
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSingleton(Configuration);
services.AddSingleton<IConfiguration>(Configuration);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
}
}
公共类启动
{
公共静态字符串连接字符串{get;private set;}
公共IConfiguration配置{get;}
public void配置服务(IServiceCollection服务)
{
services.AddMvc();
services.AddSingleton(配置);
services.AddSingleton(配置);
}
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
}
}
我的控制器:
public class CreateController : Controller
{
public IConfiguration _ConnectionString;
public CreateController(IConfiguration configuration)
{
_ConnectionString = configuration;
}
public IEnumerable<string> Get()
{
Markets();
}
public string Markets()
{
using(SqlConnection con = new SqlConnection(_ConnectionString.GetSection("Data").GetSection("ConnectionString").Value))
{
return con.Database;
}
}
}
公共类CreateController:控制器
{
公共IConfigurationString;
公共CreateController(IConfiguration配置)
{
_ConnectionString=配置;
}
公共IEnumerable Get()
{
市场();
}
公开市场()
{
使用(SqlConnection con=newsqlconnection(_ConnectionString.GetSection(“数据”).GetSection(“ConnectionString”).Value))
{
返回con.数据库;
}
}
}
您不应该在ConfigureServices
中调用services.AddSingleton(配置)
。默认情况下,它已经在DI容器中
您只需在控制器中引用它即可:
public class CreateController : Controller
{
public IConfiguration _configuration;
public CreateController(IConfiguration configuration)
{
_configuration = configuration;
}
public IEnumerable<string> Get()
{
Markets();
}
public string Markets()
{
var connectionString = _configuration.GetConnectionString("ConnectionStringName");
using( SqlConnection con = new SqlConnection(connectionString) )
{
return con.Database;
}
}
}
公共类CreateController:控制器
{
公共IConfiguration\u配置;
公共CreateController(IConfiguration配置)
{
_配置=配置;
}
公共IEnumerable Get()
{
市场();
}
公开市场()
{
var connectionString=_configuration.GetConnectionString(“ConnectionStringName”);
使用(SqlConnection con=newsqlconnection(connectionString))
{
返回con.数据库;
}
}
}
它为空,因为它尚未设置。您需要首先构建配置,这最好在构造函数中完成。正如其他人指出的那样,不建议这样做
范例
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
if (env.IsDevelopment())
{
builder.AddUserSecrets<Startup>();
}
Configuration = builder.Build();
}
private IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton(Config);
}
}
公共类启动
{
公共启动(IHostingEnvironment环境)
{
var builder=new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile(“appsettings.json”,可选:false,reloadOnChange:true)
.AddJsonFile($“appsettings.{env.EnvironmentName}.json”,可选:true)
.AddenEnvironmentVariables();
if(env.IsDevelopment())
{
builder.AddUserSecrets();
}
Configuration=builder.Build();
}
专用IConfiguration配置{get;}
public void配置服务(IServiceCollection服务)
{
services.AddSingleton(Config);
}
}
我注意到您的启动
缺少构造函数。在ASP.NET Core 2中,当它调用startup(基于典型的WebHost.CreateDefaultBuilder(args).UseStartup()
在一个普通程序中时。BuildWebHost
)将自动将配置传递到启动构造函数中:
public class Startup
{
public IConfiguration Configuration { get; }
// This configuration is automatic, if WebHost.CreateDefaultBuilder(args) is used in Program.cs
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
只需添加它就可以解决IConfiguration为空的问题
现在,您不必将该配置添加到DI中,因为默认情况下,它应该已经存在于DI中,并且您可以按原样将其添加到控制器构造函数中。然而,这样做没有害处
最后,要加入合唱团,直接在控制器中使用IConfiguration不是一个好主意。而是研究强类型配置设置。有一些教程可以提供帮助-这是我找到的-但要点是你的控制器最终会看起来像这样:
public class CreateController : Controller
{
public ConnectionStrings _ConnectionStrings;
public CreateController(IOptions<ConnectionStrings> connectionStrings)
{
_ConnectionStrings = connectionStrings.Value;
...
公共类CreateController:控制器
{
公共连接字符串\u连接字符串;
公共CreateController(IOptions连接字符串)
{
_ConnectionString=ConnectionString.Value;
...
配置设置在哪里?您还应该阅读有关配置和设置的基础文档。建议不要将IConfiguration
插入控制器。此外,这似乎是一个问题。您试图实现的最终目标是什么?基本上,我正试图从我的appsettings.json读取连接字符串你能把你的Program.cs
课程包括在问题中吗?