c# - 从 appsettings.json 文件中读取会出现 NullReferance 错误

标签 c# asp.net-core-mvc

我正在尝试从我的 appsettings.json 文件中读取一些设置,但收到了 NullReferenceException。使用不同的 SO 帖子以及我在 google 上找到的一些博客,我构建了代码,一切似乎都是正确的,没有编译错误,intillisense 一切正常,所以我不确定我错过了什么或做错了什么。

Startup.CS:

public class Startup
{
    public IConfigurationRoot Configuration { get; set; }

    public Startup(IHostingEnvironment env)
    {
        //Set up configuration sources.
        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();

        Configuration = builder.Build();
    }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        services.AddCaching();
        services.Configure<ApplicationSettingsModel>(Configuration.GetSection("AppSettings"));
        services.AddScoped<IApplicationSettings, ApplicationSettings>();

        services.AddSession(o =>
        {
            o.IdleTimeout = TimeSpan.FromSeconds(10);
        });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseExceptionHandler("/Error/ServerError");
        app.UseIISPlatformHandler();
        app.UseSession();
        app.UseStaticFiles();
        app.UseStatusCodePagesWithReExecute("/Error/PageNotFound");
        app.UseMvc();
    }

    // Entry point for the application.
    public static void Main(string[] args) => WebApplication.Run<Startup>(args);
}

I应用程序设置:

public interface IApplicationSettings
{
    IOptions<ApplicationSettingsModel> AppSettings { get; }
}

ApplicationsSettings.cs:

public class ApplicationSettings : IApplicationSettings
{
    protected readonly IOptions<ApplicationSettingsModel> _AppSettings;

    public ApplicationSettings(IOptions<ApplicationSettingsModel> AppSettings)
    {
        _AppSettings = AppSettings;
    }

    public IOptions<ApplicationSettingsModel> AppSettings
    {
        get
        {
            return _AppSettings;
        }
    }

    public string GetAppVersion()
    {
        return _AppSettings.Value.AppVersion;
    }
}

型号:

public class ApplicationSettingsModel
{
    public string AppVersion { get; set; }
    public string BugZillaAPIKey { get; set; }
    public string EmailUser { get; set; }
    public string EmailPass { get; set; }
}

调用类:

public class EHAL
{
    private static IApplicationSettings _config;

    public EHAL(IApplicationSettings config)
    {
        _config = config;
    }

    public static string Test()
    {
        return _config.AppSettings.Value.AppVersion;
    }
}

当我尝试运行 return _AppSettings.Value.AppVersion; 时出现错误。从 SO 帖子和博客来看,我认为我做的一切都是正确的,但显然我搞砸了,只是不确定是什么。

最佳答案

我不是 100% 确定你到底想做什么,但你应该能够让 DI 容器处理构造函数注入(inject),我做了一个小测试应用程序来注入(inject) test例如将类放入 Controller 中....

将您的测试类更改为

public class test : Itest
{
    protected readonly IOptions<AppSettings> _AppSettings;

    public test(IOptions<AppSettings> AppSettings)
    {
        _AppSettings = AppSettings;
    }

    public IOptions<AppSettings> AppSettings
    {
        get
        {
            return _AppSettings;
        }
    }

    public string GetAppVersion()
    {
        return _AppSettings.Value.AppVersion;
    }
}

添加接口(interface)Itest

public interface Itest
{
    IOptions<AppSettings> AppSettings { get; }
}

在您的 Startup.cs 中添加一个新行

services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
services.AddScoped<Itest, test>();

现在在您的 Controller 中,您可以执行以下操作:

 public class HomeController : Controller
    {
        private readonly Itest _config;
        public HomeController(Itest config)
        {
            _config = config;
        }
        public IActionResult Index()
        {
            var a = _config.AppSettings.Value.AppVersion;
            return View();
        }
    }

这只会将您的测试类实例注入(inject) Controller ,以便您可以在处理请求期间使用它。

同样,您不能 100% 确定您要使用它,这是一个如何让它发挥作用的示例。希望对您有所帮助!

编辑:你还有其他一些选择,你可以只注入(inject) IOptions<AppSettings>进入 Controller 构造函数并创建一个传入注入(inject)的测试类的实例 IOptions<AppSettings>以及。这样你就可以摆脱 Itest 接口(interface)和 Startup.cs 中的额外配置代码,这只是另一个想法。

编辑: 所以,我真的认为你应该看看依赖注入(inject),它真的是要走的路。但是如果你真的不想去 DI 根,你可以这样做,(改变你的静态类看起来像这样):

public class test
{
    static IConfigurationSection _Settings;

    static test()
    {

        IConfiguration _config = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .Build();

        _Settings = _config.GetSection("AppSettings");
    }

    public static string GetAppVersion()
    {
        return _Settings["AppVersion"];
    }
}

然后你可以这样调用:

var a = test.GetAppVersion();

虽然我不太喜欢用静力学来做这件事,但我试图保持你正在尝试做的事情的精神。确实,DI 是前进的方式,强烈建议您将来朝这个方向前进。

关于c# - 从 appsettings.json 文件中读取会出现 NullReferance 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35205776/

相关文章:

c# - 使用 Libtorrent save_state() 保存单个种子?

c# - Web API Controller 操作调用两次

c# - ASP.NET Core 中的单元测试标记帮助程序 - 填充标记公共(public)属性

时间:2019-03-17 标签:c#BeginGetResponse: is there any reason to read bytes asynchronously in response callback?

c# - 只返回 View 的 Controller Action 是否有必要异步?

c# - 尝试在 Appium 中获取 EditText 实例时,此 session 异常不支持定位器策略 'css selector' - C#

c# - ASP.NET Core 中必需的查询字符串参数

ado.net - 在 MVC 6 下使用 ADO.NET 的 DataTable 的替代方案是什么?

c# - 签署 ASP.NET 5 类库程序集

reference - Visual Studio 2017引用与依存关系