アプリケーション構成ファイル (web.config や app.config) に 独自設定 を追加した際、そこに指定された値に対して 独自の検証 (カスタム検証) を行う方法をまとめます。
目次
概要
独自検証を実装する場合、 ConfigurationValidatorBase クラス を継承して カスタム検証の実態 を実装し、 ConfigurationValidatorAttribute クラス 継承して カスタム検証属性 を実装することで実現できます。
カスタムエレメント に対しては 属性 を指定することで、検証を有効化します。
以下では 郵便番号として正しいフォーマットかどうか を検証する仕組みを実装、適用する サンプルコード を掲載します。
カスタム検証 の 作成
検証の実態を実装します。
実装は ConfigurationValidatorBase クラス を継承した クラス に対して実装していきます。
CanValidate メソッド および Validate メソッド は、 アプリケーション構成 の 設定 1項目 につき、2度呼び出される点に注意してください。
1度目の呼び出しは デフォルト値 の検証として呼び出され、2度目の呼び出しは 実際にconfigファイルへ記載された値 の検証として呼び出されます。
namespace WebApplication.Config
{
using System;
using System.Configuration;
using System.Text.RegularExpressions;
/// <summary>
/// オブジェクトの値が有効な郵便番号かどうか検証します。
/// </summary>
public class ZipCodeValidator : ConfigurationValidatorBase
{
/// <summary>
/// ハイフンを含む郵便番号かどうかを示す値を取得または設定します。
/// </summary>
public bool IsIncludeHyphen { get; set; }
/// <summary>
/// オブジェクトを型に基づいて検証できるかどうかを確認します。
/// </summary>
/// <param name="type">オブジェクトの型。</param>
/// <returns>type パラメーター値が検証できる type と一致する場合は true。それ以外の場合は false。</returns>
public override bool CanValidate(Type type)
{
return type == typeof(string);
}
/// <summary>
/// オブジェクトの値が有効かどうかを確認します。
/// </summary>
/// <param name="value">オブジェクト値。</param>
public override void Validate(object value)
{
var data = (string)value;
if (string.IsNullOrEmpty(data))
{
return;
}
if ((!this.IsIncludeHyphen || (!Regex.IsMatch(data, @"\d{3}\-\d{4}")) &&
(this.IsIncludeHyphen || (!Regex.IsMatch(data, @"\d{7}")))))
{
throw new ConfigurationErrorsException("Bad zip cord format.");
}
}
}
}
カスタム検証属性 の 作成
上で作成した "検証の実態" を利用できるように 属性化 させます。
属性にするためには、 ConfigurationValidatorAttribute クラス を継承した クラス に対して実装していきます。
namespace WebApplication.Config
{
using System.Configuration;
/// <summary>
/// 郵便番号検証コントロールの属性を提供します。
/// </summary>
public class ZipCodeValidatorAttribute : ConfigurationValidatorAttribute
{
/// <summary>
/// ハイフンを含む郵便番号かどうかを示す値を取得または設定します。
/// </summary>
public bool IsIncludeHyphen { get; set; }
/// <summary>
/// 検証コントロールの属性のインスタンスを取得します。
/// </summary>
public override ConfigurationValidatorBase ValidatorInstance
{
get
{
return new ZipCodeValidator()
{
IsIncludeHyphen = this.IsIncludeHyphen
};
}
}
}
}
カスタムエレメント属性 へ 適用
上までに作成した カスタム検証属性 を 実際に カスタム構成 の 属性 へ適用します。 と言っても、属性を付与するだけで利用できるので、コード的には単純です。
[ConfigurationProperty("zipcode", DefaultValue = "000-0000")]
[ZipCodeValidator(IsIncludeHyphen = true)]
public string ZipCode
{
get { return (string)base["zipcode"]; }
set { base["zipcode"] = value; }
}
config ファイル へ 記載
上までに作成した 独自アプリケーション構成 に対して、実際に設定を記述すると以下のようになります。 アプリケーション構成ファイル の 記述から検証がどうなっているか…は判断できませんが、間違った設定を行っているとアプリケーション実行時に例外が発生します。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="sampleSettings" type="WebApplication.Config.SampleConfigurationSection"/>
</configSections>
<sampleSettings>
<application zipcode="123-4567" />
</sampleSettings>
</configuration>
関連記事
- ASP.NET で web.config に アプリケーション設定 を 追加 する方法
- ASP.NET で web.config に カスタム設定 を追加する 方法
- ASP.NET で web.config に 高度な カスタム設定 を 定義する方法
- ASP.NET で web.config の カスタム設定 を 検証 する 方法
参考記事
- MSDN - ConfigurationValidatorBase クラス
- MSDN - ConfigurationValidatorAttribute クラス
- stackoverflow - Why does ConfigurationValidator validate the default value of a ConfigurationProperty even if IsRequired is true?
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!