小さなプロジェクト用の簡単な検証プロセスを作成しました。検証規則は、クラスのプロパティへの属性として作成されます。
クラス型を渡す必要がある静的クラスがあります。このメソッドは、指定されたクラスの一連のルールが既に辞書にあるかどうかを最初に確認します。そうでない場合は、リフレクションを使用して各プロパティを調べます。
この種のアプローチを使用する場合、何か問題はありますか? マルチスレッド環境でアクセスした場合に問題が発生する可能性があるのではないかと心配しています。
public static class Validator
{
private static Dictionary<Type, ValidationRulesCollection> _validationRules = new Dictionary<Type, ValidationRulesCollection>();
public static ValidationRulesCollection GetValidationRules(object obj)
{
return GetValidationRules(obj.GetType());
}
public static ValidationRulesCollection GetValidationRules(Type t)
{
ValidationRulesCollection rules = null;
/* Check if the centralized rules repository already contains the rules for this class type */
if (_validationRules.ContainsKey(t) == true)
{
rules = _validationRules[t];
}
else
{
/* Using reflection, get the list of properties for the class type */
PropertyInfo[] properties = t.GetProperties();
if (properties != null)
{
/* Iterate through each property info and check if it contains a validation rule */
ValidationAttribute[] attribs = null;
foreach (PropertyInfo property in properties)
{
/* For each property, check if it contains a validation rule */
attribs = (ValidationAttribute[])property.GetCustomAttributes(typeof(ValidationAttribute), true);
if (attribs != null)
{
foreach (ValidationAttribute attrib in attribs)
{
if (rules == null)
rules = new ValidationRulesCollection();
/* Add the validation rule to the collection */
rules.Add(new ValidationRule(property, attrib));
}
}
}
}
/* Add the rules collection to the centralized rules repository */
if (rules.Count > 0)
_validationRules.Add(t, rules);
else
throw new ArgumentNullException("The type " + t.ToString() + " does not have any ValidationAttributes");
}
return rules;
}
public static ValidationRulesCollection Validate(object obj)
{
/* Get the Validation Rules */
ValidationRulesCollection rules = GetValidationRules(obj);
/* Validate the rules */
foreach (ValidationRule rule in rules)
{
rule.Validate(obj);
}
return rules;
}
}