netcoreapp1.1中配置文件的最佳做法

时间:2017-04-10 20:45:56

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

我已经在我的Startup.cs中添加了对appsettings.json文件的访问权限作为框架服务:

public IConfigurationRoot Configuration { get; }

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();
}

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.Configure<AppConfig>(Configuration);
    services.AddMvc();
}

所以现在我可以从我的控制器访问配置文件:

   public class HomeController : Controller
    {
        private readonly AppConfig _appConfig;

        public HomeController(IOptions<AppConfig> appConfig, ConfigContext configContext)
        {
            _appConfig = appConfig.Value;
        }
}

那是有效的,但是netcoreapps目前在从我的控制器范围外的类访问配置文件方面有什么好处呢?

我的意思是我不想将所需的配置变量始终传递给其他方法,例如:

public IActionResult AnyAction() {
  SomeStaticClass.SomeMethod(_appConfig.var1, _appConfig.var2, _appConfig.var3...)

 //or always have to pass the _appConfig reference

  SomeStaticClass.SomeMethod(_appConfig)
}

在以前版本的.NET Framework中,如果我需要从&#34; SomeStaticClass&#34;访问配置文件。我曾经在任何需要访问web.config的类中使用ConfigurationManager。

在netcoreapp1.1中执行此操作的正确方法是什么?无论是ConfigurationManager还是依赖注入方法都适用于我。

2 个答案:

答案 0 :(得分:0)

我认为这个问题更多的是关于如何从静态类中获取上下文变量。我认为这将完成你想要的,但我不确定你为什么要一个静态类或者你想用它做什么(参见XY问题)。

   public class HomeController : Controller
    {
        private readonly AppConfig _appConfig;

        public HomeController(IOptions<AppConfig> appConfig, ConfigContext configContext)
        {
            _appConfig = appConfig.Value;
            SomeStaticClass.SomeStaticMember = appConfig.Value
        }
        public IActionResult AnyAction() {
            SomeStaticClass.SomeMethod(); //The get the value you want from within
        }
    }

编辑:     您可以使用Newtonsoft.Json,它是Microsoft.AspNet.Mvc.ModelBinding的依赖项,它是Microsoft.AspNet.Mvc的依赖项

string fileContents = string.Empty;
using (StreamReader file = File.OpenText(@".\appsettings.json"))
{
    fileContents = file.ReadAllLines();
}
configs= JsonConvert.DeserializeObject(fileContents );

答案 1 :(得分:0)

我所做的是创建以下类:

public static class Configuration
{
    private static IConfiguration _configuration;

    static Configuration()
    {
        var builder = new ConfigurationBuilder()
         .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json");

        _configuration = builder.Build();
    }

    public static string GetValue(string key)
    {
        return _configuration.GetValue<string>(key, null);
    }

    public static string GetValue(string section, string key)
    {
        return _configuration.GetSection(section).GetValue<string>(key);
    }
}

但是它没有使用IshostingEnvironment参数在Startup.cs中使用的环境逻辑。