mvc core 2.0,如何通过配置使用appSettings.json文件

Rod*_*her 4 dependency-injection asp.net-core asp.net-core-2.0

今天我尝试了新的asp.net核心2.0,但是在使用JSON配置文件时遇到了一些麻烦,我没有注入IConfiguration配置构造函数属性.

在asp.net核心1.1中,我将在StartUp中使用以下代码:

public static IConfigurationRoot Configuration;

Public Startup(IHostingEnvironment env) {
     var builder = new ConfigurationBuilder()
     .SetBasePath(env.ContentRootPath)
     .AddJsonFile("appSettings.json", optional: false, reloadOnChange: true)

  Configuration = builder.Build();
}
Run Code Online (Sandbox Code Playgroud)

并可以从代码访问它,如:

private string _mailTo = Startup.Configuration["mailSettings:mailToAddress"];
Run Code Online (Sandbox Code Playgroud)

然而在Core 2.0中他们改为IConfiguration并且它已经定义了,而且我没有看到任何方式我可以在我的其他类中使用该配置,所以我对如何继续进行有点无能为力.

startupClass:

    using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Mvc.Formatters;
using NLog.Web;
using NLog.Extensions.Logging;
using cityInfoTestApi.Services;

namespace cityInfoTestApi
{
    public class Startup
    {

        public IConfiguration Configuration { get; private set; }

        public Startup(IConfiguration configuration, IHostingEnvironment env)
        {
            Configuration = configuration;
            env.ConfigureNLog("nlog.config");
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc()
                .AddMvcOptions(o => o.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter()));




        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddNLog();
            app.AddNLogWeb();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseStatusCodePages();
            app.UseMvc();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });


        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的json文件:

{
    "mailSetings": {
        "mailToAddress": "admin@mycompany.com",
        "mailFromAddress":  "noreply@mycompany.com"
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要使​​用设置的自定义类(注意它是如何使用核心1.1:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;

namespace cityInfoTestApi.Services
{
    public class LocalMailService : IMailService
    {

        private string _mailTo = Startup.Configuration["mailSettings:mailToAddress"];
        private string _mailFrom = Startup.Configuration["mailSettings:mailFromAddress"];


        public void Send(string subject, string message)
        {
            Debug.WriteLine($"Mail from {_mailFrom} to {_mailTo}, with LocalMailService");
            Debug.WriteLine($"Subject: {subject}");
            Debug.WriteLine($"Message: {message}");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激,干杯!

Set*_*Set 6

是的,ASP.NET Core 2.0改变了配置构建的方式.你IWebHostBuilder.ConfigureAppConfiguration现在需要使用方法.

IWebHost在Program.cs中为您的创建添加类似的内容:

.ConfigureAppConfiguration((builderContext, config) =>
{
    IHostingEnvironment env = builderContext.HostingEnvironment;

    config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
          .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
})
Run Code Online (Sandbox Code Playgroud)

然后IConfiguration可以Startup通过构造函数将实例作为依赖项(或任何其他类,由于DI机制)注入到您的类中:

public class Startup
{
    public IConfiguration Configuration { get; }

    public Startup(IConfiguration configuration)
    {
       Configuration = configuration;
    }
    ...
 }
Run Code Online (Sandbox Code Playgroud)

有一篇很好的文章描述了这些变化:ASP.NET Core 2.0配置更改


关于从自定义类(如LocalMailService)访问设置的方法- 避免使用任何静态依赖项.这个破坏的DI概念在ASP.NET Core中使用.请阅读有关使用IOptions功能的信息.或者您可以再次使用DI并IConfiguration通过ctor 获取实例LocalMailService.

  • 问题是如何在应用程序的其余部分中使用*配置.这不能回答这个问题. (2认同)