web-dev-qa-db-ja.com

IConfigurationにカスタムJSONファイルを追加するにはどうすればよいですか?

私は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構成ファイルもロードするにはどうすればよいですか?

9
Bogey

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にカスタム構成ファイルを追加するだけです。残りは基本的に同じです。

11
jpgrassi

.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のドキュメントを参照してください。

5
Shadi Namrouti