规则引擎:用来验证字符串是否符合预配置的规则,可以通过配置文件动态定义不同的字符串验证条件
规则引擎主代码(RuleEngine.cs )
using System;
using System.Text.Regulars;
namespace Rule
{
/// <summary>
/// Rule Engine
/// </summary>
public class RuleEngine
{
/// <summary>
/// If you want the RuleEngine throw an exception when checking rule failed,
/// please set this value to true
/// </summary>
private static bool _throwException = false;
public static bool ThrowExceptionCodeDirectly
{
set
{
_throwException = value;
}
get
{
return _throwException;
}
}
/// <summary>
/// Check a group of rules by setId
/// </summary>
/// <param name="setId">the set id which you defined in configuration file</param>
/// <param name="value">the value you want check</param>
/// <returns>checking result</returns>
public static bool Process(string setId, string value)
{
bool result = false;
RuleSet ruleSet = ConfigCache.GetRuleSet(setId);
if (ruleSet!=null && ruleSet.RuleIdList!=null)
{
Rule rule;
for (int i = 0; i < ruleSet.RuleIdList.Length; i++)
{
rule = ConfigCache.GetRule(ruleSet.RuleIdList[i]);
if (!CheckRule(rule, value))
{
if (_throwException)
{
throw new Exception(rule.ErrorCode);
}
return false;
}
}
result = true;
}
return result;
}
private static bool CheckRule(Rule rule, string value)
{
bool result = false;
if (rule!=null)
{
switch (rule.Type)
{
case RuleType.IsNullOrEmpty:
result = !String.IsNullOrEmpty(value);
break;
case RuleType.MinLength:
if (!String.IsNullOrEmpty(value) && !String.IsNullOrEmpty(rule.Value))
{
int len = Int32.Parse(rule.Value);
result = (value.Length>=len);
}
break;
case RuleType.MaxLength:
if (!String.IsNullOrEmpty(value) && !String.IsNullOrEmpty(rule.Value))
{
int len = Int32.Parse(rule.Value);
result = (value.Length <= len);
}
break;
case RuleType.Pattern:
if (!String.IsNullOrEmpty(value) && !String.IsNullOrEmpty(rule.Value))
{
Regex reg = new Regex(rule.Value);
result = reg.IsMatch(value);
}
break;
case RuleType.HasSpace:
if (!String.IsNullOrEmpty(value))
{
result = !value.Contains(" ");
}
break;
default:
break;
}
}
return result;
}
}
/// <summary>
/// Rule Type Enumeration
/// Note: each int value should match with the rule type definition in config file
/// </summary>
public enum RuleType
{
IsNullOrEmpty = 1,
MinLength = 2,
MaxLength = 3,
Pattern = 4,
HasSpace = 5
}
/// <summary>
/// Rule Class
/// </summary>
public class Rule
{
/// <summary>
/// Rule ID
/// </summary>
private string _id;
public string ID
{
set
{
_id = value;
}
get
{
return _id;
}
}
/// <summary>
/// Rule Name
/// </summary>
private string _name;
public string Name
{
set
{
_name = value;
}
get
{
return _name;
}
}
/// <summary>
/// Rule Type
/// </summary>
private RuleType _type;
public RuleType Type
{
set
{
_type = value;
}
get
{
return _type;
}
}
/// <summary>
/// Set true to reverse a rule result
/// </summary>
private bool _isNot = false;
public bool IsNot
{
set
{
_isNot = value;
}
get
{
return _isNot;
}
}
/// <summary>
/// ErrorCode
/// </summary>
private string _errorCode;
public string ErrorCode
{
set
{
_errorCode = value;
}
get
{
return _errorCode;
}
}
/// <summary>
/// Value data of config file
/// </summary>
private string _value;
public string Value
{
set
{
_value = value;
}
get
{
return _value;
}
}
}
/// <summary>
/// A group of rules
/// </summary>
public class RuleSet
{
/// <summary>
/// Set Id
/// </summary>
private string _setId;
public string SetId
{
set
{
_setId = value;
}
get
{
return _setId;
}
}
/// <summary>
/// Rule Id List
/// </summary>
private string[] _ruleIdList;
public string[] RuleIdList
{
set
{
_ruleIdList = value;
}
get
{
return _ruleIdList;
}
}
}
}
using System.Text.Regulars;
namespace Rule
{
/// <summary>
/// Rule Engine
/// </summary>
public class RuleEngine
{
/// <summary>
/// If you want the RuleEngine throw an exception when checking rule failed,
/// please set this value to true
/// </summary>
private static bool _throwException = false;
public static bool ThrowExceptionCodeDirectly
{
set
{
_throwException = value;
}
get
{
return _throwException;
}
}
/// <summary>
/// Check a group of rules by setId
/// </summary>
/// <param name="setId">the set id which you defined in configuration file</param>
/// <param name="value">the value you want check</param>
/// <returns>checking result</returns>
public static bool Process(string setId, string value)
{
bool result = false;
RuleSet ruleSet = ConfigCache.GetRuleSet(setId);
if (ruleSet!=null && ruleSet.RuleIdList!=null)
{
Rule rule;
for (int i = 0; i < ruleSet.RuleIdList.Length; i++)
{
rule = ConfigCache.GetRule(ruleSet.RuleIdList[i]);
if (!CheckRule(rule, value))
{
if (_throwException)
{
throw new Exception(rule.ErrorCode);
}
return false;
}
}
result = true;
}
return result;
}
private static bool CheckRule(Rule rule, string value)
{
bool result = false;
if (rule!=null)
{
switch (rule.Type)
{
case RuleType.IsNullOrEmpty:
result = !String.IsNullOrEmpty(value);
break;
case RuleType.MinLength:
if (!String.IsNullOrEmpty(value) && !String.IsNullOrEmpty(rule.Value))
{
int len = Int32.Parse(rule.Value);
result = (value.Length>=len);
}
break;
case RuleType.MaxLength:
if (!String.IsNullOrEmpty(value) && !String.IsNullOrEmpty(rule.Value))
{
int len = Int32.Parse(rule.Value);
result = (value.Length <= len);
}
break;
case RuleType.Pattern:
if (!String.IsNullOrEmpty(value) && !String.IsNullOrEmpty(rule.Value))
{
Regex reg = new Regex(rule.Value);
result = reg.IsMatch(value);
}
break;
case RuleType.HasSpace:
if (!String.IsNullOrEmpty(value))
{
result = !value.Contains(" ");
}
break;
default:
break;
}
}
return result;
}
}
/// <summary>
/// Rule Type Enumeration
/// Note: each int value should match with the rule type definition in config file
/// </summary>
public enum RuleType
{
IsNullOrEmpty = 1,
MinLength = 2,
MaxLength = 3,
Pattern = 4,
HasSpace = 5
}
/// <summary>
/// Rule Class
/// </summary>
public class Rule
{
/// <summary>
/// Rule ID
/// </summary>
private string _id;
public string ID
{
set
{
_id = value;
}
get
{
return _id;
}
}
/// <summary>
/// Rule Name
/// </summary>
private string _name;
public string Name
{
set
{
_name = value;
}
get
{
return _name;
}
}
/// <summary>
/// Rule Type
/// </summary>
private RuleType _type;
public RuleType Type
{
set
{
_type = value;
}
get
{
return _type;
}
}
/// <summary>
/// Set true to reverse a rule result
/// </summary>
private bool _isNot = false;
public bool IsNot
{
set
{
_isNot = value;
}
get
{
return _isNot;
}
}
/// <summary>
/// ErrorCode
/// </summary>
private string _errorCode;
public string ErrorCode
{
set
{
_errorCode = value;
}
get
{
return _errorCode;
}
}
/// <summary>
/// Value data of config file
/// </summary>
private string _value;
public string Value
{
set
{
_value = value;
}
get
{
return _value;
}
}
}
/// <summary>
/// A group of rules
/// </summary>
public class RuleSet
{
/// <summary>
/// Set Id
/// </summary>
private string _setId;
public string SetId
{
set
{
_setId = value;
}
get
{
return _setId;
}
}
/// <summary>
/// Rule Id List
/// </summary>
private string[] _ruleIdList;
public string[] RuleIdList
{
set
{
_ruleIdList = value;
}
get
{
return _ruleIdList;
}
}
}
}
配置文件(RuleEngine.config )
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<defaultErrorCode>500</defaultErrorCode>
<!--Rule Type Definition: Fixed, Do not change-->
<ruleType>
<type id="1" name="IsNullOrEmpty"></type>
<type id="2" name="MinLength"></type>
<type id="3" name="MaxLength"></type>
<type id="4" name="Pattern"></type>
<type id="5" name="HasSpace"></type>
</ruleType>
<!--Rules Configuration: id and type are required attributes-->
<rules>
<!--Email Validation-->
<rule id="1" name="EmailNotEmpty" type="1" errorCode="-712"></rule>
<rule id="2" name="EmailPattern" type="4" errorCode="-710" value="^([\\w-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([\\w-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"></rule>
<!--UserName Validation-->
<rule id="3" name="UserNameNotEmpty" type="1" errorCode="-778"></rule>
<rule id="4" name="UserNamePattern" type="4" errorCode="-707" value="^[-._a-zA-Z0-9]+$"></rule>
<rule id="5" name="MinUserNameLength" type="2" errorCode="-706" value="4"></rule>
<rule id="6" name="MaxUserNameLength" type="3" errorCode="-705" value="20"></rule>
<!--Password Validation-->
<rule id="7" name="UserPasswordNotEmpty" type="1" errorCode="-714"></rule>
<rule id="8" name="UserPasswordSpace" type="5" errorCode="-717"></rule>
<rule id="9" name="UserPasswordPattern" type="4" errorCode="-748" value="^((\\d+)|([!-/:-@\\[-`{-~]+)|(\\d+[a-zA-Z]+|[a-zA-Z]+\\d+)([\\da-zA-A]*)|([!-/:-@\\[-`{-~]+[a-zA-Z]+|[a-zA-Z]+[!-/:-@\\[-`{-~]+)([a-zA-Z!-/:-@\\[-`{-~]*)|(\\d+[a-zA-Z]+[!-/:-@\\[-`{-~]+|\\d+[!-/:-@\\[-`{-~]+[a-zA-Z]+|[a-zA-Z]+\\d+[!-/:-@\\[-`{-~]+|[a-zA-Z]+[!-/:-@\\[-`{-~]+\\d+|[!-/:-@\\[-`{-~]+[a-zA-Z]+\\d+|[!-/:-@\\[-`{-~]+\\d+[a-zA-Z]+)([\\da-zA-Z!-/:-@\\[-`{-~]*))$"></rule>
<rule id="10" name="MinUserPasswordLength" type="2" errorCode="-715" value="6"></rule>
<rule id="11" name="MaxUserPasswordLength" type="3" errorCode="-716" value="16"></rule>
<!--User Profile Validation-->
<rule id="12" name="UserDobNotEmpty" type="1" errorCode="-720"></rule>
<rule id="13" name="UserDobPattern" type="4" errorCode="-721" value="^[12]\\d{3}-(0?[1-9]|1[0-2])-(0?[1-9]|[1-2]\\d|3[01])$"></rule>
<rule id="14" name="UserCountryNotEmpty" type="1" errorCode="-724"></rule>
<rule id="15" name="UserLanguageNotEmpty" type="1" errorCode="-727"></rule>
<rule id="16" name="UserTosVersionNotEmpty" type="1" errorCode="-729"></rule>
<rule id="17" name="UserStatusNotEmpty" type="1" errorCode="-731"></rule>
<!--Persona Profile Validation-->
<rule id="18" name="PersonaDisplayNameNotEmpty" type="1" errorCode="-761"></rule>
<rule id="19" name="MinPersonaDisplayNameLength" type="1" errorCode="-764"></rule>
<rule id="20" name="MaxPersonaDisplayNameLength" type="1" errorCode="-763"></rule>
<rule id="21" name="PersonaDisplayNamePattern" type="4" errorCode="-1803" value="^[-._a-zA-Z0-9]+$"></rule>
<rule id="22" name="PersonaStatusNotEmpty" type="1" errorCode="-766"></rule>
</rules>
<!--Rule Set Configuration: do not add comments in ruleSets node-->
<ruleSets>
<set id="userEmail">
<rule id="1"></rule>
<rule id="2"></rule>
</set>
<set id="userName">
<rule id="3"></rule>
<rule id="4"></rule>
<rule id="5"></rule>
<rule id="6"></rule>
</set>
<set id="userPassword">
<rule id="7"></rule>
<rule id="8"></rule>
<rule id="9"></rule>
<rule id="10"></rule>
<rule id="11"></rule>
</set>
<set id="userDob">
<rule id="12"></rule>
<rule id="13"></rule>
</set>
<set id="userCountry">
<rule id="14"></rule>
</set>
<set id="userLanguage">
<rule id="15"></rule>
</set>
<set id="userTosVersion">
<rule id="16"></rule>
</set>
<set id="userStatus">
<rule id="17"></rule>
</set>
<set id="personaName">
<rule id="18"></rule>
<rule id="19"></rule>
<rule id="20"></rule>
<rule id="21"></rule>
</set>
<set id="personaStatus">
<rule id="22"></rule>
</set>
</ruleSets>
</configuration>
<configuration>
<defaultErrorCode>500</defaultErrorCode>
<!--Rule Type Definition: Fixed, Do not change-->
<ruleType>
<type id="1" name="IsNullOrEmpty"></type>
<type id="2" name="MinLength"></type>
<type id="3" name="MaxLength"></type>
<type id="4" name="Pattern"></type>
<type id="5" name="HasSpace"></type>
</ruleType>
<!--Rules Configuration: id and type are required attributes-->
<rules>
<!--Email Validation-->
<rule id="1" name="EmailNotEmpty" type="1" errorCode="-712"></rule>
<rule id="2" name="EmailPattern" type="4" errorCode="-710" value="^([\\w-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([\\w-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"></rule>
<!--UserName Validation-->
<rule id="3" name="UserNameNotEmpty" type="1" errorCode="-778"></rule>
<rule id="4" name="UserNamePattern" type="4" errorCode="-707" value="^[-._a-zA-Z0-9]+$"></rule>
<rule id="5" name="MinUserNameLength" type="2" errorCode="-706" value="4"></rule>
<rule id="6" name="MaxUserNameLength" type="3" errorCode="-705" value="20"></rule>
<!--Password Validation-->
<rule id="7" name="UserPasswordNotEmpty" type="1" errorCode="-714"></rule>
<rule id="8" name="UserPasswordSpace" type="5" errorCode="-717"></rule>
<rule id="9" name="UserPasswordPattern" type="4" errorCode="-748" value="^((\\d+)|([!-/:-@\\[-`{-~]+)|(\\d+[a-zA-Z]+|[a-zA-Z]+\\d+)([\\da-zA-A]*)|([!-/:-@\\[-`{-~]+[a-zA-Z]+|[a-zA-Z]+[!-/:-@\\[-`{-~]+)([a-zA-Z!-/:-@\\[-`{-~]*)|(\\d+[a-zA-Z]+[!-/:-@\\[-`{-~]+|\\d+[!-/:-@\\[-`{-~]+[a-zA-Z]+|[a-zA-Z]+\\d+[!-/:-@\\[-`{-~]+|[a-zA-Z]+[!-/:-@\\[-`{-~]+\\d+|[!-/:-@\\[-`{-~]+[a-zA-Z]+\\d+|[!-/:-@\\[-`{-~]+\\d+[a-zA-Z]+)([\\da-zA-Z!-/:-@\\[-`{-~]*))$"></rule>
<rule id="10" name="MinUserPasswordLength" type="2" errorCode="-715" value="6"></rule>
<rule id="11" name="MaxUserPasswordLength" type="3" errorCode="-716" value="16"></rule>
<!--User Profile Validation-->
<rule id="12" name="UserDobNotEmpty" type="1" errorCode="-720"></rule>
<rule id="13" name="UserDobPattern" type="4" errorCode="-721" value="^[12]\\d{3}-(0?[1-9]|1[0-2])-(0?[1-9]|[1-2]\\d|3[01])$"></rule>
<rule id="14" name="UserCountryNotEmpty" type="1" errorCode="-724"></rule>
<rule id="15" name="UserLanguageNotEmpty" type="1" errorCode="-727"></rule>
<rule id="16" name="UserTosVersionNotEmpty" type="1" errorCode="-729"></rule>
<rule id="17" name="UserStatusNotEmpty" type="1" errorCode="-731"></rule>
<!--Persona Profile Validation-->
<rule id="18" name="PersonaDisplayNameNotEmpty" type="1" errorCode="-761"></rule>
<rule id="19" name="MinPersonaDisplayNameLength" type="1" errorCode="-764"></rule>
<rule id="20" name="MaxPersonaDisplayNameLength" type="1" errorCode="-763"></rule>
<rule id="21" name="PersonaDisplayNamePattern" type="4" errorCode="-1803" value="^[-._a-zA-Z0-9]+$"></rule>
<rule id="22" name="PersonaStatusNotEmpty" type="1" errorCode="-766"></rule>
</rules>
<!--Rule Set Configuration: do not add comments in ruleSets node-->
<ruleSets>
<set id="userEmail">
<rule id="1"></rule>
<rule id="2"></rule>
</set>
<set id="userName">
<rule id="3"></rule>
<rule id="4"></rule>
<rule id="5"></rule>
<rule id="6"></rule>
</set>
<set id="userPassword">
<rule id="7"></rule>
<rule id="8"></rule>
<rule id="9"></rule>
<rule id="10"></rule>
<rule id="11"></rule>
</set>
<set id="userDob">
<rule id="12"></rule>
<rule id="13"></rule>
</set>
<set id="userCountry">
<rule id="14"></rule>
</set>
<set id="userLanguage">
<rule id="15"></rule>
</set>
<set id="userTosVersion">
<rule id="16"></rule>
</set>
<set id="userStatus">
<rule id="17"></rule>
</set>
<set id="personaName">
<rule id="18"></rule>
<rule id="19"></rule>
<rule id="20"></rule>
<rule id="21"></rule>
</set>
<set id="personaStatus">
<rule id="22"></rule>
</set>
</ruleSets>
</configuration>
配置信息缓存类(RuleEngine_ConfigCache.cs)
using System;
using System.IO;
using System.Xml;
using EA.Common.Util;
namespace Rule
{
///
using System.IO;
using System.Xml;
using EA.Common.Util;
namespace Rule
{
///