【问题标题】:Unable to read details from appsettings.json无法从 appsettings.json 读取详细信息
【发布时间】:2017-05-02 11:43:26
【问题描述】:

我无法从 appsettings.json 中检索值,当我运行下面的代码时,出现错误

System.NullReferenceException: 'Object reference not set to an instance of an object.

appSettings.json

"MySettings": {
"ConnectionString": "",
"Provider": "Microsoft.EntityFrameworkCore.SqlServer" }

Startup.cs

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();
        Configuration = builder.Build();
    }


    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddMvc();
        services.Configure<MySettings>(Configuration.GetSection("MySettings"));
    }

MySettings.cs

public class MySettings 
{
    public static string ConnectionString { get; set; }

    public static string Provider { get; set; }
}

TestDriveDatabase.cs

public class TestDriveDatabase
{
    private IDatabase objDLOperation;

    public TestDriveDatabase(string strConnectionstring)
    {
        objDLOperation = GetDataLayerInstance(strConnectionstring);
    }
    public IDatabase GetDataLayerInstance(string strConnectionstring)
    {
        IDatabase objInstance = null;
        var provider = MySettings.Provider;

        if (provider == "Microsoft.EntityFrameworkCore.SqlServer")
        {
            objInstance = new SQLDatabase(strConnectionstring);
        }
        else if (provider == "Npgsql.EntityFrameworkCore.PostgreSQL")
        {
            objInstance = new PostgreDatabase(strConnectionstring);
        }

        return objInstance;
    }
}

不幸的是,从appsettings.jsonMySettings 的映射没有发生,变量provider 始终保持为空。这里有什么问题?

【问题讨论】:

  • 从属性中移除 static 修饰符。通过 DI 传递 MySettings
  • 如果去掉静态,就不能简单的访问MySettings.Provider
  • 当然。它应该如何工作:stackoverflow.com/q/43679665/5112433
  • @izengod:映射仅适用于实例属性,不适用于静态属性。其次,您应该将MySettings 类注入您的服务(通过IOptions&lt;MySettings&gt;),而不是访问它的静态属性
  • @Tseng 我尝试不使用 DI,因为我没有在控制器中调用它。

标签: asp.net-core .net-core


【解决方案1】:

先去掉static关键字,不能将配置值映射到静态属性

public class MySettings 
{
    public string ConnectionString { get; set; }

    public string Provider { get; set; }
}

其次,将MySettings 注入您的TestDriveDatabase

public class TestDriveDatabase
{
    private IDatabase objDLOperation;
    private readonly MySettings settings;

    public TestDriveDatabase(IOptions<MySettings> mySettings)
    {
        this.settings = mySettings.Value;
        objDLOperation = GetDataLayerInstance(strConnectionstring);
    }
    public IDatabase GetDataLayerInstance(string strConnectionstring)
    {
        IDatabase objInstance = null;
        var provider = settings.Provider;

        if (provider == "Microsoft.EntityFrameworkCore.SqlServer")
        {
            objInstance = new SQLDatabase(settings.Connectionstring);
        }
        else if (provider == "Npgsql.EntityFrameworkCore.PostgreSQL")
        {
            objInstance = new PostgreDatabase(settings.Connectionstring);
        }

        return objInstance;
    }
}

【讨论】:

  • 酷!但是在创建实例时我应该在 TestDriveDatabase ctor 中传递什么?因为它需要一个 IOptions 对象。我需要在控制器内部调用另一个 TestDriveDatabase 方法。
  • 一路使用依赖注入。唯一应该使用new 关键字的时候是在创建模型或在工厂方法内部。所有其他服务都应通过 DI 完成。这就是首先使用 DI 的全部意义所在。即当您在 Controller 的 ctor 中定义 TestDriveDatabase 时,IOption&lt;MySettings&gt; 也将被 DI 解析,因为 `TestDriveDatabase 也被它解析。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 2022-08-19
  • 2015-01-31
  • 2015-07-03
相关资源
最近更新 更多