ASP.NET で web.config に カスタム設定 を追加する 方法

0 件のコメント

ASP.NET だと web.config 、通常のアプリだと app.config に独自の設定 (カスタムセクション、カスタム要素) を記述、利用する方法についてまとめます。 ここでは流れを理解できるよう、基本的な部分に絞ってまとめます。

目次

カスタム設定 の 作成

"カスタム設定" と記載していますが、実際に作成するのは "カスタムセクション" と "カスタムエレメント"、 "カスタムコレクション" になります。 ここではあまり詳しいことは避け、基本だけ (カスタムセクション と カスタムエレメント のみ) 実装してみます。 "カスタムセクション" は config における カスタム設定 の ルート要素 になり、 "カスタムエレメント" は 子要素 になります。

カスタムセクション の作成

"カスタムセクション" は web.config または app.config に独自設定を記述するときの ルート要素 になります。 カスタムセクション は .NET 2.0 以上の場合は ConfigurationSection クラス を継承して作成し、.NET 1.0 または 1.1 の場合は IConfigurationSectionHandler インターフェース を実装します。 まだ .NET 1.0, 1.1 の環境で作らなきゃ…は考えづらいので、今回は .NET 2.0 以上を前提として進めていきます。 カスタムセクションに プリミティブ型 の プロパティ を記述すると config 上では 属性 に、カスタムエレメント を プロパティ として記述すると config 上では 子要素 になります。 ここでは 子要素 になるよう コーディング しています (config 中において カスタムセクション / app となるような実装) 。

SampleConfigurationSection.cs

namespace WebApplication.Config
{
    using System.Configuration;

    public class SampleConfigurationSection : ConfigurationSection
    {
        [ConfigurationProperty("app")]
        public ApplicationConfigElement App
        {
            get
            {
                return (ApplicationConfigElement)base["app"];
            }

            set
            {
                base["app"] = value;
            }
        }
    }
}

カスタムエレメント の作成

"カスタムエレメント" は 実際に設定を保持する要素で、 ConfigurationElement クラス を継承して作成します。 config 中において、設定は 要素の属性 として設定します (<要素名 属性="値" /> のような記述で設定する) 。 要素の値 として設定は保持できなそうでした (<要素名>値</要素名> のような記述はできない) 。

以下では 属性 を 1つ 保持するよう実装しています (app / @message となる実装) 。

ApplicationConfigElement.cs

namespace WebApplication.Config
{
    using System.Configuration;

    public class ApplicationConfigElement : ConfigurationElement
    {
        [ConfigurationProperty("message")]
        public string Message
        {
            get
            {
                return (string)base["message"];
            }

            set
            {
                base["message"] = value;
            }
        }
    }
}

カスタム設定 の 利用

上で準備した カスタムセクション と カスタムエレメント は、 web.config または app.config へ記載し、 コード で 読み取ることで利用します。 以下では web.config への 記述 と コード で 読み取る 方法について記載します。

web.config へ 記述

上述した カスタムセクション および カスタムエレメント を実際に web.config に記載して利用しようとすると、以下のようになります。

web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="sampleSettings" type="WebApplication.Config.SampleConfigurationSection"/>
  </configSections>

  <!-- いろいろ省略... -->

  <sampleSettings>
    <app message="Hello, world !" />
  </sampleSettings>
</configuration>

カスタムセクション を利用できるようにするため、 configSections および section 要素 を記述します。 section 要素 は、どちらかと言うと カスタム設定 を利用する際の決まり文句に近いものだと思います。 sampleSettings 要素以下に カスタム設定 を記述することで利用できます。

section / @name
記載する名前は カスタムセクション を実際に web.config 中の要素として利用する名前になり、9行目 および 11行目 に記載されている 要素名 に一致します。
section / @type
記載する型名は カスタムセクション クラス の 完全名 および アセンブリが異なればアセンブリ名になります。
sampleSettings
section / @name で指定した名前を要素名として使います。この要素は カスタムセクション で作成した ルート要素 に一致します。
app
カスタムセクション の カスタムエレメント プロパティ に設定した ConfigurationProperty が 要素名 になります。 入れ子にした際は適宜読み替えてください。
app / @message
プリミティブ型 に 設定した ConfigurationProperty は 属性名 になります。

コード で 読み取り

ConfigurationManager.GetSection() を利用して カスタムセクション 要素 を取得します。 取得した後は通常のオブジェクト操作と同じように設定値へアクセスできます。 残念なのは、 GetSection( string ) で指定する セクション名 が、 config ファイルの section / @name で指定した値になるところでしょうか。 この部分は固定になってしまうので要注意です。

SampleController.cs

namespace WebApplication.Controllers
{
    using System;
    using System.Configuration;
    using System.Web.Http;
    using WebApplication.Config;

    public class SampleController : ApiController
    {
        public void Get()
        {
            var config = ConfigurationManager.GetSection("sampleSettings") as SampleConfigurationSection;
            Console.WriteLine(config.App.Message);
        }
    }
}

関連記事

参考記事