【问题标题】:How can I add a custom JSON file into IConfiguration?如何将自定义 JSON 文件添加到 IConfiguration?
【发布时间】:2018-03-01 09:47:22
【问题描述】:

我正在使用 asp.net + Autofac。

我正在尝试加载自定义 JSON 配置文件,并基于该文件创建/实例化一个 IConfiguration 实例,或者至少将我的文件包含到默认情况下构建的任何 IConfiguration asp.net 中。

我的问题是 asp.net 似乎覆盖了 IConfiguration 的依赖注册。

我似乎无法注册我自己的 IConfiguration 对象 - DI 容器将始终将此解析为似乎由 asp.net 库本身生成的某个实例。

而且我不确定如何让 asp.net 至少另外加载我的自定义配置文件 - 即是否有任何方法可以获取它使用的 ConfigurationBuilder,并在它之前添加我自己的文件构建 IConfiguration 对象。

我尝试了以下方法:

public class Startup
{
    public IConfigurationRoot Configuration { get; }

    public Startup(IHostingEnvironment env)
    {
        this.Configuration = new ConfigurationBuilder()
            .SetBasePath(path)
            .AddJsonFile("somefile.json")
            .Build();
    }

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services
          .AddMvc()
          .AddControllersAsServices();

         var builder = new ContainerBuilder();
         builder.Register(x => this.Configuration).As<IConfiguration>();
         builder.Populate(services);

         var container = builder.Build();

         // This will return another IConfiguration instance then the one I registered; 
         // namely One that contains 1 provider, a MemoryConfigurationProvider
         var xxx = container.Resolve<IConfiguration>();

         return new AutofacServiceProvider(container);
    }
}

如何让 asp.net 也加载我的自定义 JSON 配置文件?

【问题讨论】:

  • 您使用的是哪个版本的 ASPNET Core?

标签: c# asp.net-core autofac


【解决方案1】:

.Net Core 2.2需要修改Program.cs:

之前

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
           .UseStartup<Startup>();

之后

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)

            //This is how you attach additional JSON files
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddJsonFile("customSettings.json", optional: false, reloadOnChange: false);
            })
            //End of update
            .UseStartup<Startup>();

有关最新修正和添加其他类型的自定义设置,请参阅以下article 的 Microsoft 文档。

【讨论】:

  • 这个实现效果很好,其他实现会导致数据库迁移命令出现问题。
【解决方案2】:

您可以使用Options 模式来做到这一点:

在 ASP.NET Core 2 上,在 Program.cs 上注册配置文件

public class Program
{
    public static void Main(string[] args)
    {
        var configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)

             // custom config file
            .AddJsonFile("myappconfig.json", optional: false, reloadOnChange: false)
            .Build();

        BuildWebHost(args, configuration).Run();
    }

    public static IWebHost BuildWebHost(string[] args, IConfiguration config) =>
        WebHost.CreateDefaultBuilder(args)
            .UseConfiguration(config)
            .UseStartup<Startup>()
            .Build();
}

创建一个与你的配置文件匹配的类:

public class MyAppConfig
{
    public string SomeConfig { get; set; }

    public int NumberConfig { get; set; }
}

ConfigureServices注册

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.Configure<MyAppConfig>(Configuration);
}

然后,只需在控制器中访问它:

[Route("api/[controller]")]
public class ValuesController : Controller
{
    private readonly MyAppConfig _appConfig;

    public ValuesController(IOptions<MyAppConfig> optionsAccessor)
    {
        if (optionsAccessor == null) throw new ArgumentNullException(nameof(optionsAccessor));
        _appConfig = optionsAccessor.Value;
    }

    // GET api/values/5
    [HttpGet("{id}")]
    public string Get(int id)
    {
        return _appConfig.SomeConfig;
    }
}

如果您还没有使用 ASP.NET Core 2,则过程几乎相同。您只需在Startup.cs 上添加自定义配置文件。其余基本相同。

【讨论】:

    【解决方案3】:

    从 ASP.NET Core 5.0 开始,它就像在 Program.cs 中对 CreateDefaultBuilder(args) 的调用中添加对 ConfigureAppConfiguration() 的调用一样简单,如下所示:

    来自

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    config.AddJsonFile("CustomSettings.json", optional: false, reloadOnChange: false);
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      • 2014-06-03
      • 2016-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多