WebSurfer's Home

トップ > Blog 1   |   ログイン
APMLフィルター

WinForms アプリで構成情報の上書き (CORE)

by WebSurfer 2023年8月19日 13:26

Windows Forms アプリで接続文字列その他の構成情報がデバッグ版とリリース版で異なるケースがあると思います。ターゲットフレームワークが .NET 6.0 の Windows Forms アプリで、デバッグ版とリリース版での構成情報を別々の json 形式のファイルに格納し、プログラムで構成情報を上書きして使用する方法を書きます。

(注: ターゲットフレームワークが .NET Framework 4.8 の Windows Forms アプリでも Microsoft.Extensions.Configuration.Json を NuGet からインストールして以下の記事と同様なことは可能です)

先の記事「WinForms で構成情報とコンテキストの DI (CORE)」で、Windows Forms アプリでも json 形式の構成ファイルに構成情報を格納し、それから情報を取得してアプリで使用できることを書きました。

(Microsoft のドキュメント「.NET Framework から .NET にアップグレードした後に最新化する」でも、.NET アプリでは App.config ではなくて json 形式のファイルを構成ファイルとして利用することが推奨されているようです)

ASP.NET Core アプリでは、appsettings.json に加えて appsettings.Production.json を追加しておけば、プロジェクトに組み込みの機能が運用環境での環境変数を読み取って、それが Production であれば自動的に appsettings.Production.json から構成情報を取得して上書き・追加を行うようになっています。詳しくは先の記事「環境別の appsettings.json (CORE)」を見てください。

Windows Forms アプリには ASP.NET Core のような組み込みの機能はありませんが、アプリのプログラムで動的に appsettings.json の情報を appsettings.Production.json の情報で上書きすることができます。(注: ASP.NET Core アプリと違って json ファイルの名前は任意です。この記事では ASP.NET Core アプリに合わせていますが)

接続文字列がデバッグ版とリリース版で異なるような場合は、デバッグ版の接続文字列は appsettings.json に設定し、リリース版の接続文字列は appsettings.Production.json に設定しておいて、アプリのプログラムで動的に appsettings.Production.json に設定した接続文字列を使用するということも可能です。

具体例を書きます。まず、以下のような json 形式の構成ファイルを用意します。ファイル名は ASP.NET Core の例に合わせて appsettings.json, appsettings.Production.json としましたが、ASP.NET Core の機能を使うわけではないので、任意です。

appsettings.json

{
  "ConnectionStrings": {
    "NorthwindConnection": "Data Source=(localdb)\\MSSQLLocalDB;Database=NORTHWIND;Integrated Security=True"
  },
  "FilePath": "C:\\Users\\surfe\\Documents",
  "FileName": "development.txt"
}

appsettings.Production.json

{
  "ConnectionStrings": {
    "NorthwindConnection": "Server=MyServer;Database=NORTHWIND;Integrated Security=True"
  },
  "FileName": "production.txt",
  "AdditionalInfo": "project dependent info"
}

上の例で、接続文字列 NorthwindConnection とファイル名 FileName はデバッグ版とリリース版で異なる、パス名 FilePath は共通、AdditionalInfo はリリース版でのみ必要な追加の情報という想定です。

appsettings.json の情報を appsettings.Production.json の情報で上書きする具体例は以下の通りです。説明はコメントに書きましたのでそれを読んでください。(ASP.NET Core アプリのように、環境変数を読み込んでそれにより json ファイルを切り替えるところまでは下のコードには含んでいません。無条件で上書きされるので注意してください)

using Microsoft.Extensions.Configuration;

namespace WinFormsApp5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // appsettings.json にはデバッグ版の接続文字列その他の
            // 構成情報を含む

            // appsettings.Production.json にはリリース版の接続文字
            // 列、その他リリース版では異なる情報、追加でリリース版
            // に必要な情報を含む

            // IConfiguration (アプリケーションで使用するキー/値ベー
            // スの構成情報) をビルドするための ConfigurationBuilder
            // を生成
            var builder = new ConfigurationBuilder()
                // ファイルベースのプロバイダ (appsettings.json) が
                // 存在するディレクトリを指定。下のコードで指定して
                // いるのはアプリケーションの現在の作業ディレクトリ
                .SetBasePath(Directory.GetCurrentDirectory())
                // 指定されたディレクトリの appsettings.json (JSON
                // 構成プロバイダ) を ConfigurationBuilder に追加
                .AddJsonFile("appsettings.json", optional: false);

            // 加えて、appsettings.Production.json を追加
            builder.AddJsonFile("appsettings.Production.json",
                                optional: false);

            // 追加されたプロバイダは以下のようにして確認できる
            var sources = builder.Sources;

            // ソースに登録されているプロバイダーのキーと値を使用し
            // て IConfiguration をビルド。その時、appsettings.json
            // と同じ名前のキーが appsettings.Production.json にあ
            // る場合は後者の情報で上書きされる
            IConfiguration config = builder.Build();

            // IConfiguration から構成情報を取得
            string? connString = 
                config.GetConnectionString("NorthwindConnection");
            string? filePath = config["FilePath"];
            string? fileName = config["FileName"];
            string? addInfo = config["AdditionalInfo"];
        }
    }
}

結果は以下の通りとなります。appsettings.json の情報が appsettings.Production.json の情報で上書きされているのが分かりますでしょうか?

構成情報の上書き

Tags: , , ,

CORE

環境別の appsettings.json (CORE)

by WebSurfer 2020年9月23日 12:10

開発環境と運用環境では、通常、接続文字列やエラー表示などが異なります。.NET Framework 版の ASP.NET Web アプリではそれらの設定は web.config ファイルに含まれており、運用環境にデプロイする際は該当部分を書き換える必要があります。

Visual Studio で開発を行う場合は、運用環境にデプロイする際書き換える部分をあらかじめ Web.Release.config というファイルに作っておき、Visual Studio の発行ツールを使ってデプロイ時に書き換えるということが可能です。

Web.Release.config

上の画像は Visual Studio Community 2019 のテンプレートを使って作成した ASP.NET Web Forms アプリで自動生成される Web.Release.config です。接続文字列とエラー表示の設定を書き換えるためのひな型が含まれています。

しかし、Core 版には .NET Framework 版と同じ機能はなさそうです。では、どうするかですが、以下の Microsoft のドキュメントに説明がありました(日本語版は翻訳がダメなので意味が分からないときは英語版を見てください)。

ASP.NET Core の構成

ASP.NET Core で複数の環境を使用する

appsettings.json に加えて、必要に応じて appsettings.Development.json, appsettings.Staging.json, appsettings.Production.json を追加し、それにそれぞれの環境専用の接続文字列などの設定を書きます。(注: Visual Studio のテンプレートを使うと appsettings.json と appsettings.Development.json は自動的に作成されプロジェクトに含まれているはずです)

appsettings.json

そして、例えば接続文字列を環境によって変えたい場合、appsettings.Development.json, appsettings.Staging.json, appsettings.Production.json にそれぞれの環境の接続文字列を書けば、環境変数 ASPNETCORE_ENVIRONMENT の値 (Development, Staging, Production のいずれか)によってファイルを選んでそれから接続文字列を取得してきます。

結果は appsettings.json の設定プラス appsettings.環境.json の設定になります。appsettings.json の設定を丸ごと appsettings.環境.json の設定に置き換えるということはしませが、設定がダブった場合(同じ名前のキーがあった場合)は、上に紹介した記事「ASP.NET Core の構成」に書いてある通り、appsettings.json の方をオーバーライドします。

例えば、開発環境においては、appsettings.Development.json 構成が appsettings.json の値を上書きします。運用環境では、appsettings.Production.json 構成が appsettings.json の値を上書きします。

なお、環境変数 ASPNETCORE_ENVIRONMENT が設定されてない場合は、上に紹介した記事「ASP.NET Core で複数の環境を使用する」に書いてあるように、デフォルトで Production になることに注意してください。

では、環境変数 ASPNETCORE_ENVIRONMENT をどのように設定するかですが・・・

開発環境では Visual Studio のテンプレートを使ってプロジェクトを作ると自動的に生成される launchSettings.json ファイルに "Development" と設定されています。

launchSettings.json

(注: 上の画像で赤枠で囲った方は Visual Studio から実行した場合デフォルトになる IIS Express を使ってインプロセスホスティングで実行する場合の設定です。下の方は Kestrel で実行する場合の設定です)

"Development" を "Staging", "Production" に変更して試してみると、上に書いた通り、取得してくる先の appsettings.環境.json が異なるのが分かるはずです。

運用環境では launchSettings.json ファイルは使いません。デプロイもされません。ではどうするかですが、そもそも環境変数なので、上に紹介した記事「ASP.NET Core で複数の環境を使用する」の「環境を設定する」のセクションに書いてあるようにして設定できるそうです。

または、ASPNETCORE_ENVIRONMENT が設定されてなければデフォルトで Production なので何も設定しないということでも良いかもしれません。

上に書いた appsettings.json の設定で接続文字列は環境によって書き換えできますが、エラー表示の設定の変更はできないので注意してください。それは Startup.cs の Configure メソッドで行います(HTTP 要求を処理するパイプラインを構成するためのミドルウェアの一部として登録)。

Visual Studio のテンプレートを使ってプロジェクトを作成すると、Startup.cs ファイルに以下のような Configure メソッドが自動的に生成されるはずです(日本語のコメントは自分が追加したものです)。

Startup.cs

環境変数 ASPNETCORE_ENVIRONMENT が Development に設定されていると env.IsDevelopment() が true になって、開発用の詳細エラーページが表示されるようになります。

Tags: , , , ,

CORE

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。

Calendar

<<  2024年4月  >>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

View posts in large calendar