现在的位置: 首页 > 综合 > 正文

用来验证字符串的规则引擎

2012年07月21日 ⁄ 综合 ⁄ 共 10435字 ⁄ 字号 评论关闭

规则引擎:用来验证字符串是否符合预配置的规则,可以通过配置文件动态定义不同的字符串验证条件

 

规则引擎主代码(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;
            }
        }
    }
}

 

 

配置文件(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>

 

 

配置信息缓存类(RuleEngine_ConfigCache.cs)

using System;
using System.IO;
using System.Xml;
using EA.Common.Util;
namespace Rule
{
    
///

抱歉!评论已关闭.