mvc core 2.0, how to use an appSettings.json file via configuration

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-23 15:02:15

问题


Today I was trying out the new asp.net core 2.0 but ran into some trouble using a JSON configuration file that I wasnt to inject in IConfiguration configuration constructor property.

In asp.net core 1.1 I would use this following code in 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();
}

and could access it from the code like:

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

However In Core 2.0 they changed to IConfiguration and it's already defined moreover I don't see any way i can use the configuration in my other classes, so I'm kinda clueless on how to proceed.

The 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?}");
            });


        }
    }
}

my json file:

{
    "mailSetings": {
        "mailToAddress": "admin@mycompany.com",
        "mailFromAddress":  "noreply@mycompany.com"
    }
}

my custom class wanting to use the settings (note it was how i would use core 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}");
        }
    }
}

any help would be much appreciated, Cheers!


回答1:


Yes, ASP.NET Core 2.0 has changed the way for configuration building. You need to use IWebHostBuilder.ConfigureAppConfiguration method now.

Add something like this to your IWebHost creation in 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);
})

Then IConfiguration instance may be injected to your Startup class via constructor as a dependency (or any other class, thanks to DI mechanism):

public class Startup
{
    public IConfiguration Configuration { get; }

    public Startup(IConfiguration configuration)
    {
       Configuration = configuration;
    }
    ...
 }

There is a good article that describes those changes: ASP.NET Core 2.0 Configuration Changes


Regarding your way to get access to settings from custom classes (like LocalMailService) - avoid using any static dependencies. This broken DI conception used in ASP.NET Core. Read about using IOptions feature instead. Or you may again use DI and get IConfiguration instance via ctor in LocalMailService.




回答2:


I think you can use IOptions to pass a configuration file to your service. Create a class for your configuration:

public class MailSetings
{
    public string MailToAddress {get;set;}
    public string MailFromAddress {get;set}

    public class MailSetings() { }
}

Configure the service to use those settings:

//...
using Microsoft.Extensions.Configuration;
//...

public class Startup
{
    //..

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<MailSetings>(Configuration);
        //...
    }

Now you should be able to inject this in your service constructor:

//...
using Microsoft.Extensions.Options;

public class LocalMailService : IMailService
{
    private string _mailTo;
    private string _mailFrom;

    public LocalMailService(IOptions<MailSetings> options)
    {
        _mailTo = options.Value.MailToAddress;
        _mailFrom = options.Value.MailFromAddress;
    }

    //...
}


来源:https://stackoverflow.com/questions/46632090/mvc-core-2-0-how-to-use-an-appsettings-json-file-via-configuration

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!