2020-01-07 更新

複数プロジェクトで同じ構成ファイル(appsettings.json)を利用する

ASP.NET CoreのWebアプリケーション開発時、複数プロジェクトで同じ構成ファイル(appsettings.json)を利用したいことがあり、開発当時はやり方が分からずに断念しましたが、最近になって改めて調べたら、やり方が見つかったのでメモしておきます。

確認しているASP.NET Coreのバージョンは2.0になります。

目次

  • コード
  • 注意点
  • 参考リンク

コード

Webアプリケーション作成時に自動で生成されている「Program.cs」ファイルに、「ConfigureAppConfiguration」の部分を追記します。


public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                var env = hostingContext.HostingEnvironment;
                config.AddJsonFile(Path.GetFullPath(Path.Combine(@"../appsettings.json")), optional: true, reloadOnChange: true);
                config.AddJsonFile(Path.GetFullPath(Path.Combine($@"../appsettings.{env.EnvironmentName}.json")), optional: true, reloadOnChange: true);
            })
            .UseStartup<Startup>()
            .Build();
}

引数はファイルパスと、optionalは構成ファイルが必須かどうか、reloadOnChangeは構成ファイルに変更あった場合の再読み込みフラグ、となります。

ファイルパスに「../」を指定することで一つ上の階層にあるappsettings.jsonを読み込むようにしています。(最終的には絶対パスをセット)

それぞれのファイルやディレクトリの構成は以下の通り。


AppSolution
├── Project01
│  ├── program.cs
│  ├── Startup.cs
│  ├── appsettings.json
│  └── appsettings.Development.json
│
├── Project02
│  ├── program.cs
│  ├── Startup.cs
│  ├── appsettings.json
│  └── appsettings.Development.json
│
├── appsettings.json
└── appsettings.Development.json

上記のような場合、読み込む構成ファイルの順番は

  • プロジェクト(Project01、Project02)直下のappsettings.json
  • プロジェクト(Project01、Project02)直下のappsettings.Development.json
  • ソリューション(AppSolution)直下のappsettings.json
  • ソリューション(AppSolution)直下のappsettings.Development.json

となります。

また、構成ファイルに同じキーが含まれていた場合、後から読み込んだ内容で上書きされます。

本番環境(Linux)にデプロイした際も上記のパス指定は有効だったので、一つ上の階層に構成ファイルを置くことで、プロジェクトそれぞれに同じ情報を記述する手間が省けます。

注意点

上記の設定を行う際の注意点は、ソリューション直下に用意した構成ファイルが後で読み込まれてしまうので、共通のファイルにデフォルトの情報を記述して、各プロジェクトでデフォルトの情報を任意で書き換える、といったことができません。

あくまで、プロジェクト直下の構成ファイルに追加する、という認識で利用するのがいいと思います。

もしかしたら、「AddJsonFile」でプロジェクト直下の構成ファイルを最後に読み直せばいけるかもしれませんが、それについては未確認です。

参考リンク

ASP.NET Core】関連記事