CS前置/后置事件框架

         把CommunityServer的事件框架应用到当前的项目中,可以在一个方法调用中设置其前置和后置事件,从而把一个额外的业务处理外置到别的模块中进行独立处理。
1、需要定义一系列的委托,如public delegate void PSPRoleEventHandler(PRole pRole, PSEventArgs e);委托参数的定义决定以后事件的参数,这里的PSEventArgs用于表示一些通用的参数传入,例如ObjectState针对对象操作的状态。

    public enum ObjectState
    
{
        Create,
        Update,
        Delete,
        None,
        Runtime
    }

    public class PSEventArgs : EventArgs
    
{
        
private ObjectState _state;

        
public ObjectState State
        
{
            
get return _state; }
        }


        
public PSEventArgs(ObjectState state)
        
{
            _state 
= state;
        }


        
public PSEventArgs() : this(ObjectState.None) { }
    }

2、创建PSApplication类,用于统一定义一些事件,并从配置文件的模块配置加载这些事件的真实调用,以下为一下例子:
    public class PSApplication
    
{
        
private members

        
Event Keys (static)

        
cnstr

        
PRole Events
    }


其中的internal static PSApplication Instance()方法用于实例化PSApplication对象并从配置文件中加载事件真实实现的模块信息,例如模块配置可以写成这样:
<Configurations>
    
<PSModules>
        
<add name="PRoleModule" type="CSDN.PermissionService.Components.PRoleModule, CSDN.PermissionService.Components" />    
    
</PSModules>
</Configurations>
这样通过组件CSDN.PermissionService.Components中的CSDN.PermissionService.Components.PRoleModule模块就可以加载对角色操作的一些前后事件的功能
public event PSPRoleEventHandler PrePRoleUpdate 添加或移除在PRole数据保存到数据库之前的触发事件
public event PSPRoleEventHandler PRoleUpdate 添加或移除在PRole数据保存到数据库之后的触发事件
private EventHandlerList Events = new EventHandlerList(); 用于保存一下委托的事件列表

对于模块设计需要定实现一个IPSModule接口
    public interface IPSModule
    
{
        
void Init(PSApplication psa, XmlNode node);
    }
例如:PRoleModule
    public class PRoleModule : IPSModule
    
{

        
public void Init(PSApplication psa, System.Xml.XmlNode node)
        
{
            psa.PrePRoleUpdate 
+= new PSPRoleEventHandler(psa_PrePRoleUpdate);
            psa.PRoleUpdate 
+= new PSPRoleEventHandler(psa_PRoleUpdate);
        }



        
private void psa_PrePRoleUpdate(PRole pRole, PSEventArgs e)
        
{
            
//前置事件
        }


        
private void psa_PRoleUpdate(PRole pRole, PSEventArgs e)
        
{
            
//后置事件
        }


    }
在模块里可以注册一些相关的事件,并且实现这些事件,以把一些前置或后置处理外置到主业务体外。
对于PSEvents是些方法调用的封装:
    public class PSEvents
    
{
        
PRoles
    }

原文地址:https://www.cnblogs.com/chenjunbiao/p/1760236.html