IConfiguration 对象为空。

use*_*447 3 asp.net-core asp.net-core-2.0

我正在尝试从中读取连接字符串,appsettings.json并且正在使用:

services.AddSingleton(Configuration);
Run Code Online (Sandbox Code Playgroud)

启动时的这一行抛出空值。我对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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的控制器:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*lah 5

我注意到你Startup缺少一个构造函数。在 ASP.NET Core 2 中,当它调用 startup(基于一个典型WebHost.CreateDefaultBuilder(args).UseStartup<Startup>()的 vanilla 内部Program.BuildWebHost)时,会自动将配置传递到 Startup 构造函数中:

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;
    }
Run Code Online (Sandbox Code Playgroud)

只需添加即可解决您的 IConfiguration 为空问题。

现在,您不必将该配置添加到 DI 中,因为默认情况下它应该已经在那里,您可以将它按原样添加到您的控制器构造函数中。但是,这样做没有坏处。

最后,要加入合唱团,直接在控制器中使用 IConfiguration 不是一个好主意。而是查看强类型配置设置。有一些教程可以提供帮助 - 这是我找到的第一个链接- 但要点是您的控制器最终看起来像这样:

public class CreateController : Controller
{
    public ConnectionStrings _ConnectionStrings;
    public CreateController(IOptions<ConnectionStrings> connectionStrings)
    {
        _ConnectionStrings = connectionStrings.Value;
        ...
Run Code Online (Sandbox Code Playgroud)