Community Server专题六:Delegates & Events

 

Community Server专题六:Delegates & Events<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

对于CS的分析你可以能会从页面开始,其实那并不是一个很好的方法,因为CS采用了MasterPage和内建的ThemeSkins,页面一层嵌套一层,如果你对CS页面执行机制不了解,或者你是初学者,这个时候可能就会碰壁,接着就放弃了对CS更深入的了解。我希望我的专题能从CS的运行过程开始一步一步地讲解,同时把ASP.NET的运行机理也表述出来,因此学习了解CS的过程就是对ASP.NET深入了解得过程。当然,我个人的开发经验与水平也是有限的,如果在专题中表述有问题,或者有疑问可以直接在文章的评论中直接指出,我将万分感谢你。

在分析CSHttpModule.cs的时候,你会看到这样两句代码:

CSEvents.UserKnown(csContext.User);

CSEvents.CSException(csException);

其实短短两行代码后面隐藏了DelegatesEvents的大量运用,CS也通过这样的运用实现了一种模块化的处理机制,即CSModules

打开CommunityServerWeb项目下的communityserver.config文件,这是CS的配置文件(Web.config不同,communityserver.config主要配置的是CS内部的一些运行机制,而Web.config主要配置的是与Asp.net的交互)。找到文件中的这段:

None.gif < CSModules >
None.gif
None.gif              
< add  name  = "CSMembershipRulesModule"  type  = "CommunityServer.Components.CSMembershipRulesModule, CommunityServer.Components"   />
None.gif
None.gif              
< add  name  = "CSCatastrophicExceptionModule"  type  = "CommunityServer.Components.CSCatastrophicExceptionModule, CommunityServer.Components"   />
None.gif
None.gif        
< add  name  = "CSExceptionModule"  type  = "CommunityServer.Components.CSExceptionModule, CommunityServer.Components"   />
None.gif
None.gif              
< add  name  = "IrcCommands"  type  = "CommunityServer.Discussions.Components.IrcCommandsModule, CommunityServer.Discussions"   />
None.gif
None.gif              
< add  name  = "ForumCensorship"  type  = "CommunityServer.Discussions.Components.CensorshipModule, CommunityServer.Discussions"   />
None.gif
None.gif              
< add  name  = "ForumEmoticon"  type  = "CommunityServer.Discussions.Components.EmoticonModule, CommunityServer.Discussions"   />
None.gif
None.gif              
< add  name  = "ForumSourceCode"  type  = "CommunityServer.Discussions.Components.SourceCodeModule, CommunityServer.Discussions"   />
None.gif
None.gif              
< add  name  = "ForumHtmlScrubbing"  type  = "CommunityServer.Discussions.Components.HtmlScrubbingModule, CommunityServer.Discussions"   />
None.gif
None.gif              
< add  name  = "BBcodeToHtml"  type  = "CommunityServer.Discussions.Components.BBcodeToHtmlModule, CommunityServer.Discussions"   />
None.gif
None.gif              
< add  name  = "ForumPlainText"  type  = "CommunityServer.Discussions.Components.PlainTextModule, CommunityServer.Discussions"   />
None.gif
None.gif     
None.gif
None.gif              
< add  name  = "WeblogCensorModule"  type  = "CommunityServer.Blogs.Components.CensorModule, CommunityServer.Blogs"   />
None.gif
None.gif              
< add  name  = "WeblogPostandArticleHtmlScrubbing"  type  = "CommunityServer.Blogs.Components.PostandArticleHtmlScrubbing, CommunityServer.Blogs"   />
None.gif
None.gif              
< add  name  = "WeblogFeedbackHtmlFormatting"  type  = "CommunityServer.Blogs.Components.FeedbackHtmlFormatting, CommunityServer.Blogs"   />
None.gif
None.gif              
< add  name  = "TrackbackModule"  type  = "CommunityServer.Blogs.Components.TrackbackModule, CommunityServer.Blogs"   />
None.gif
None.gif              
< add  name  = "XmlRpcPingModule"  type  = "CommunityServer.Blogs.Components.XmlRpcPingModule, CommunityServer.Blogs"   />
None.gif
None.gif              
< add  name  = "WeblogFormattingModule"  type  = "CommunityServer.Blogs.Components.WeblogFormattingModule, CommunityServer.Blogs"   />
None.gif
None.gif              
< add  name  = "PictureCensor"  type  = "CommunityServer.Galleries.Components.CensorPictureModule, CommunityServer.Galleries"   />
None.gif
None.gif              
< add  name  = "PictureHtmlScrubber"  type  = "CommunityServer.Galleries.Components.HtmlScrubberModule, CommunityServer.Galleries"   />
None.gif
None.gif              
< add  name  = "PictureComments"  type  = "CommunityServer.Galleries.Components.CommentModule, CommunityServer.Galleries"   />
None.gif
None.gif              
<!--  <add name = "MaxPictureSize" type = "CommunityServer.Galleries.Components.MaxPictureSizeModule, CommunityServer.Galleries" maxWidth="1024" maxHeight="768" quality="90" />  -->
None.gif
None.gif         
</ CSModules >
None.gif
None.gif

我们拿出其中的一个来分析运行过程,例:

     <add name = "CSExceptionModule" type = "CommunityServer.Components.CSExceptionModule, CommunityServer.Components" />

这是CS中异常处理的模块,当发生异常的时候该模块将调用一个RedirectToMessage方法,提示一个友好的错误界面,告诉请求的用户有错误发生。那么CS系统是如何在发生错误的时候自动调用RedirectToMessage方法转向另外一个页面提示友好错误的呢?先打开CommunityServerComponents项目下Components文件夹中的CSApplication.cs

 

None.gif using  System;
None.gif
None.gif
using  System.Collections;
None.gif
None.gif
using  System.ComponentModel;
None.gif
None.gif
using  System.Web.Caching;
None.gif
None.gif
using  System.Xml;
None.gif
None.gif
using  CommunityServer.Configuration;
None.gif
None.gif 
None.gif
None.gif
namespace  CommunityServer.Components
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif     
Delegates#region Delegates
InBlock.gif
InBlock.gif     
//Do we want one single delegate or a custom one for each type
InBlock.gif
InBlock.gif     
//public delegate void CSEventHandler(object sender, CSEventArgs e);
InBlock.gif

InBlock.gif     
public delegate void CSUserEventHandler(User user, CSEventArgs e);
InBlock.gif
InBlock.gif     
public delegate void CSPostEventHandler(Post post, CSEventArgs e);
InBlock.gif
InBlock.gif     
public delegate void CSSectionEventHandler(Section section, CSEventArgs e);
InBlock.gif
InBlock.gif     
public delegate void CSGroupEventHandler(Group group, CSEventArgs e);
InBlock.gif
InBlock.gif     
public delegate void CSExceptionHandler(CSException csEx, CSEventArgs e);
InBlock.gif
ExpandedSubBlockEnd.gif     
#endregion

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif     
/**//// <summary>
InBlock.gif
InBlock.gif     
/// Summary description for CSApplication.
InBlock.gif
ExpandedSubBlockEnd.gif     
/// </summary>

InBlock.gif
InBlock.gif     
public class CSApplication
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif     
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
private members#region private members
InBlock.gif
InBlock.gif         
private EventHandlerList Events = new EventHandlerList();
InBlock.gif
InBlock.gif         
private static readonly object sync = new object();
InBlock.gif
InBlock.gif         
private Hashtable modules = new Hashtable();
InBlock.gif
ExpandedSubBlockEnd.gif         
#endregion

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
Event Keys (static)#region Event Keys (static)
InBlock.gif
InBlock.gif         
private static object EventAuthorizePost = new object();
InBlock.gif
InBlock.gif         
private static object EventPrePostUpdate = new object();
InBlock.gif
InBlock.gif         
private static object EventPreProcessPost = new object();
InBlock.gif
InBlock.gif         
private static object EventPostPostUpdate = new object();
InBlock.gif
InBlock.gif         
private static object EventRatePost = new object();
InBlock.gif
InBlock.gif         
//private static object EventPreRenderPost = new object();
InBlock.gif

InBlock.gif 
InBlock.gif
InBlock.gif         
private static object EventPreUserUpdate = new object();
InBlock.gif
InBlock.gif         
private static object EventPostUserUpdate = new object();
InBlock.gif
InBlock.gif         
private static object EventUserRemove = new object();
InBlock.gif
InBlock.gif         
private static object EventUserKnown = new object();
InBlock.gif
InBlock.gif         
private static object EventUserValidated = new object();
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
private static object EventPreSectionUpdate = new object();
InBlock.gif
InBlock.gif         
private static object EventPostSectionUpdate = new object();
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
private static object EventPreSectionGroupUpdate = new object();
InBlock.gif
InBlock.gif         
private static object EventPostSectionGroupUpdate = new object();
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
private static object EventUnhandledException = new object();
InBlock.gif
ExpandedSubBlockEnd.gif         
#endregion

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
cnstr#region cnstr
InBlock.gif
InBlock.gif         
private CSApplication()
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
internal static CSApplication Instance()
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              
const string key = "CSApplication";
InBlock.gif
InBlock.gif              CSApplication app 
= CSCache.Get(key) as CSApplication;
InBlock.gif
InBlock.gif              
if(app == null)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              
dot.gif{
InBlock.gif
InBlock.gif                   
lock(sync)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                   
dot.gif{
InBlock.gif
InBlock.gif                       app 
= CSCache.Get(key) as CSApplication;
InBlock.gif
InBlock.gif                       
if(app == null)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                       
dot.gif{
InBlock.gif
InBlock.gif                            CSConfiguration config 
= CSContext.Current.Config;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                            XmlNode node 
= config.GetConfigSection("CommunityServer/CSModules");
InBlock.gif
InBlock.gif                            app 
= new CSApplication();
InBlock.gif
InBlock.gif                            
if(node != null)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                            
dot.gif{
InBlock.gif
InBlock.gif                                 
foreach(XmlNode n in node.ChildNodes)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                                 
dot.gif{
InBlock.gif
InBlock.gif                                     
if(n.NodeType != XmlNodeType.Comment)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                                     
dot.gif{
InBlock.gif
InBlock.gif                                          
switch(n.Name)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                                          
dot.gif{
InBlock.gif
InBlock.gif                                               
case "clear":
InBlock.gif
InBlock.gif                                                   app.modules.Clear();
InBlock.gif
InBlock.gif                                                   
break;
InBlock.gif
InBlock.gif                                               
case "remove":
InBlock.gif
InBlock.gif                                                   app.modules.Remove(n.Attributes[
"name"].Value);
InBlock.gif
InBlock.gif                                                   
break;
InBlock.gif
InBlock.gif                                               
case "add":
InBlock.gif
InBlock.gif                                               
InBlock.gif
InBlock.gif                                                   
string name = n.Attributes["name"].Value;
InBlock.gif
InBlock.gif                                                   
string itype = n.Attributes["type"].Value;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                                                   Type type 
= Type.GetType(itype);
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                                                   
if(type == null)
InBlock.gif
InBlock.gif                                                        
throw new Exception(itype + " does not exist");
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                                                   ICSModule mod 
= Activator.CreateInstance(type) as ICSModule;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                                                   
if(mod == null)
InBlock.gif
InBlock.gif                                                        
throw new Exception(itype + " does not implement ICSModule or is not configured correctly");
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                                                   mod.Init(app, n);
InBlock.gif
InBlock.gif                                                   app.modules.Add(name,mod);
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                                                   
break;
InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockEnd.gif                                          }

InBlock.gif
ExpandedSubBlockEnd.gif                                     }

InBlock.gif
ExpandedSubBlockEnd.gif                                 }

InBlock.gif
ExpandedSubBlockEnd.gif                            }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                            CacheDependency dep 
= new CacheDependency(nullnew string[]dot.gif{CSConfiguration.CacheKey});
InBlock.gif
InBlock.gif                            CSCache.Max(key, app,dep);
InBlock.gif
ExpandedSubBlockEnd.gif                       }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                       
InBlock.gif
ExpandedSubBlockEnd.gif                   }

InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
InBlock.gif              
return app;
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
ExpandedSubBlockEnd.gif         
#endregion

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
Post Events#region Post Events
InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
Execute Events#region Execute Events
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
internal void ExecuteAuthorizePost()
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              ExecuteUserEvent(EventAuthorizePost,CSContext.Current.User);
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
internal void ExecutePrePostEvents(Post post, ObjectState state, ApplicationType appType)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              ExecutePostEvent(EventPreProcessPost,post,state,appType);
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
internal void ExecutePrePostUpdateEvents(Post post, ObjectState state, ApplicationType appType)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              ExecutePostEvent(EventPrePostUpdate,post,state,appType);
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
internal void ExecutePostPostUpdateEvents(Post post, ObjectState state, ApplicationType appType)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              ExecutePostEvent(EventPostPostUpdate,post,state,appType);
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
internal void ExecuteRatePostEvents(Post post, ApplicationType appType)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              ExecutePostEvent(EventRatePost,post,ObjectState.None,appType);
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif
//       internal void ExecutePrePostRender(Post post, ApplicationType appType)
InBlock.gif
InBlock.gif
//       {
InBlock.gif
InBlock.gif
//            ExecutePostEvent(EventPreRenderPost,post,ObjectState.None,appType);
InBlock.gif
InBlock.gif
//       }
InBlock.gif

InBlock.gif 
InBlock.gif
InBlock.gif         
protected void ExecutePostEvent(object EventKey, Post post,ObjectState state, ApplicationType appType)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              CSPostEventHandler handler 
= Events[EventKey] as CSPostEventHandler;
InBlock.gif
InBlock.gif              
if (handler != null)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              
dot.gif{
InBlock.gif
InBlock.gif                   handler(post, 
new CSEventArgs(state,appType));
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockEnd.gif         
#endregion

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
Events#region Events
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
/**//// <summary>
InBlock.gif
InBlock.gif         
/// Event raised before a user accesses a page which can be used to create content
InBlock.gif
ExpandedSubBlockEnd.gif         
/// </summary>

InBlock.gif
InBlock.gif         
public event CSUserEventHandler AuthorizePost
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              add
dot.gif{Events.AddHandler(EventAuthorizePost, value);}
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              remove
dot.gif{Events.RemoveHandler(EventAuthorizePost, value);}
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
/**//// <summary>
InBlock.gif
InBlock.gif         
/// Event raised before any post processing takes place
InBlock.gif
ExpandedSubBlockEnd.gif         
/// </summary>

InBlock.gif
InBlock.gif         
public event CSPostEventHandler PreProcessPost
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              add
dot.gif{Events.AddHandler(EventPreProcessPost, value);}
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              remove
dot.gif{Events.RemoveHandler(EventPreProcessPost, value);}
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
/**//// <summary>
InBlock.gif
InBlock.gif         
/// Fires after PreProcessPost but before the post change is commited to the datastore
InBlock.gif
ExpandedSubBlockEnd.gif         
/// </summary>

InBlock.gif
InBlock.gif         
public event CSPostEventHandler PrePostUpdate
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              add
dot.gif{Events.AddHandler(EventPrePostUpdate, value);}
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              remove
dot.gif{Events.RemoveHandler(EventPrePostUpdate, value);}
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
/**//// <summary>
InBlock.gif
InBlock.gif         
/// Fires after a post change is commited to the datastore
InBlock.gif
ExpandedSubBlockEnd.gif         
/// </summary>

InBlock.gif
InBlock.gif         
public event CSPostEventHandler PostPostUpdate
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              add
dot.gif{Events.AddHandler(EventPostPostUpdate, value);}
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              remove
dot.gif{Events.RemoveHandler(EventPostPostUpdate, value);}
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
/**//// <summary>
InBlock.gif
InBlock.gif         
/// Fires after a Post or Thread is rated
InBlock.gif
ExpandedSubBlockEnd.gif         
/// </summary>

InBlock.gif
InBlock.gif         
public event CSPostEventHandler RatePost
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              add
dot.gif{Events.AddHandler(EventRatePost, value);}
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              remove
dot.gif{Events.RemoveHandler(EventRatePost, value);}
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif
//       /// <summary>
InBlock.gif
InBlock.gif
//       /// Event raised before an individual post is rendered
InBlock.gif
InBlock.gif
//       /// </summary>
InBlock.gif
InBlock.gif
//       public event CSPostEventHandler PreRenderPost
InBlock.gif
InBlock.gif
//       {
InBlock.gif
InBlock.gif
//            add{Events.AddHandler(EventPreRenderPost, value);}
InBlock.gif
InBlock.gif
//            remove{Events.RemoveHandler(EventPreRenderPost, value);}
InBlock.gif
InBlock.gif
//       }
InBlock.gif

InBlock.gif 
InBlock.gif
ExpandedSubBlockEnd.gif         
#endregion

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockEnd.gif         
#endregion

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
User Events#region User Events
InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
Execute Events#region Execute Events
InBlock.gif
InBlock.gif         
InBlock.gif
InBlock.gif         
internal void ExecuteUserValidated(User user)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              ExecuteUserEvent(EventUserValidated,user);
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
internal void ExecuteUserKnown(User user)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              ExecuteUserEvent(EventUserKnown,user);
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
internal void ExecutePreUserUpdate(User user, ObjectState state)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              ExecuteUserEvent(EventPreUserUpdate,user,state,ApplicationType.Unknown);
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
internal void ExecutePostUserUpdate(User user, ObjectState state)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              ExecuteUserEvent(EventPostUserUpdate,user,state,ApplicationType.Unknown);
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
internal void ExecuteUserRemove(User user)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              ExecuteUserEvent(EventUserRemove,user,ObjectState.Delete,ApplicationType.Unknown);
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
protected void ExecuteUserEvent(object EventKey, User user)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              ExecuteUserEvent(EventKey,user,ObjectState.None,ApplicationType.Unknown);
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif         
protected void ExecuteUserEvent(object EventKey, User user,ObjectState state, ApplicationType appType)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              CSUserEventHandler handler 
= Events[EventKey] as CSUserEventHandler;
InBlock.gif
InBlock.gif              
if (handler != null)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              
dot.gif{
InBlock.gif
InBlock.gif                   handler(user, 
new CSEventArgs(state,appType));
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockEnd.gif         
#endregion

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
Events#region Events
InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
/**//// <summary>
InBlock.gif
InBlock.gif         
/// Fires after a user's credentials have been validated.
InBlock.gif
ExpandedSubBlockEnd.gif         
/// </summary>

InBlock.gif
InBlock.gif         
public event CSUserEventHandler UserValidated
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              add
dot.gif{Events.AddHandler(EventUserValidated, value);}
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              remove
dot.gif{Events.RemoveHandler(EventUserValidated, value);}
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
/**//// <summary>
InBlock.gif
InBlock.gif         
/// Fires once the current user has been identified. This user may still be anonymous.
InBlock.gif
ExpandedSubBlockEnd.gif         
/// </summary>

InBlock.gif
InBlock.gif         
public event CSUserEventHandler UserKnown
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              add
dot.gif{Events.AddHandler(EventUserKnown, value);}
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              remove
dot.gif{Events.RemoveHandler(EventUserKnown, value);}
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
/**//// <summary>
InBlock.gif
InBlock.gif         
/// Fires before a User is saved/updated to the datastore
InBlock.gif
ExpandedSubBlockEnd.gif         
/// </summary>

InBlock.gif
InBlock.gif         
public event CSUserEventHandler PreUserUpdate
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              add
dot.gif{Events.AddHandler(EventPreUserUpdate, value);}
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              remove
dot.gif{Events.RemoveHandler(EventPreUserUpdate, value);}
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
/**//// <summary>
InBlock.gif
InBlock.gif         
/// Fires after a User is saved/updated to the datastore
InBlock.gif
ExpandedSubBlockEnd.gif         
/// </summary>

InBlock.gif
InBlock.gif         
public event CSUserEventHandler PostUserUpdate
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              add
dot.gif{Events.AddHandler(EventPostUserUpdate, value);}
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              remove
dot.gif{Events.RemoveHandler(EventPostUserUpdate, value);}
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
/**//// <summary>
InBlock.gif
InBlock.gif         
/// Fires before a User is removed from the datastore.
InBlock.gif
ExpandedSubBlockEnd.gif         
/// </summary>

InBlock.gif
InBlock.gif         
public event CSUserEventHandler UserRemove
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              add
dot.gif{Events.AddHandler(EventUserRemove, value);}
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              remove
dot.gif{Events.RemoveHandler(EventUserRemove, value);}
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockEnd.gif         
#endregion

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockEnd.gif         
#endregion

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
Section Events#region Section Events
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
internal void ExecutePreSectionUpdate(Section section, ObjectState state, ApplicationType appType)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              CSSectionEventHandler handler 
= Events[EventPreSectionUpdate] as CSSectionEventHandler;
InBlock.gif
InBlock.gif              
if (handler != null)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              
dot.gif{
InBlock.gif
InBlock.gif                   handler(section, 
new CSEventArgs(state,appType));
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
internal void ExecutePostSectionUpdate(Section section, ObjectState state, ApplicationType appType)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              CSSectionEventHandler handler 
= Events[EventPostSectionUpdate] as CSSectionEventHandler;
InBlock.gif
InBlock.gif              
if (handler != null)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              
dot.gif{
InBlock.gif
InBlock.gif                   handler(section, 
new CSEventArgs(state,appType));
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
/**//// <summary>
InBlock.gif
InBlock.gif         
/// Event raised before a section change is committed to the datastore (create/update)
InBlock.gif
ExpandedSubBlockEnd.gif         
/// </summary>

InBlock.gif
InBlock.gif         
public event CSSectionEventHandler PreSectionUpdate
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              add
dot.gif{Events.AddHandler(EventPreSectionUpdate, value);}
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              remove
dot.gif{Events.RemoveHandler(EventPreSectionUpdate, value);}
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
/**//// <summary>
InBlock.gif
InBlock.gif         
/// Event raised after a section chage is committed to the data store
InBlock.gif
ExpandedSubBlockEnd.gif         
/// </summary>

InBlock.gif
InBlock.gif         
public event CSSectionEventHandler PostSectionUpdate
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              add
dot.gif{Events.AddHandler(EventPostSectionUpdate, value);}
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              remove
dot.gif{Events.RemoveHandler(EventPostSectionUpdate, value);}
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockEnd.gif         
#endregion

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
Group Events#region Group Events
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
internal void ExecutePreSectionGroupUpdate(Group group, ObjectState state, ApplicationType appType)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              CSGroupEventHandler handler 
= Events[EventPreSectionGroupUpdate] as CSGroupEventHandler;
InBlock.gif
InBlock.gif              
if (handler != null)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              
dot.gif{
InBlock.gif
InBlock.gif                   handler(group, 
new CSEventArgs(state,appType));
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
internal void ExecutePostSectionGroupUpdate(Group group, ObjectState state, ApplicationType appType)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              CSGroupEventHandler handler 
= Events[EventPostSectionGroupUpdate] as CSGroupEventHandler;
InBlock.gif
InBlock.gif              
if (handler != null)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              
dot.gif{
InBlock.gif
InBlock.gif                   handler(group, 
new CSEventArgs(state,appType));
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
/**//// <summary>
InBlock.gif
InBlock.gif         
/// Event raised before a group chage is committed to the datastore (create/update)
InBlock.gif
ExpandedSubBlockEnd.gif         
/// </summary>

InBlock.gif
InBlock.gif         
public event CSGroupEventHandler PreSectionGroupUpdate
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              add
dot.gif{Events.AddHandler(EventPreSectionGroupUpdate, value);}
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              remove
dot.gif{Events.RemoveHandler(EventPreSectionGroupUpdate, value);}
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
/**//// <summary>
InBlock.gif
InBlock.gif         
/// Event raised after a group chage is committed to the data store
InBlock.gif
ExpandedSubBlockEnd.gif         
/// </summary>

InBlock.gif
InBlock.gif         
public event CSGroupEventHandler PostSectionGroupUpdate
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              add
dot.gif{Events.AddHandler(EventPostSectionGroupUpdate, value);}
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              remove
dot.gif{Events.RemoveHandler(EventPostSectionGroupUpdate, value);}
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockEnd.gif         
#endregion

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
Exceptions#region Exceptions
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
/**//// <summary>
InBlock.gif
InBlock.gif         
/// Event raised before a group chage is committed to the datastore (create/update)
InBlock.gif
ExpandedSubBlockEnd.gif         
/// </summary>

InBlock.gif
InBlock.gif         
public event CSExceptionHandler CSException
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              add
dot.gif{Events.AddHandler(EventUnhandledException, value);}
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              remove
dot.gif{Events.RemoveHandler(EventUnhandledException, value);}
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
internal void ExecuteCSExcetion(CSException csEx)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              CSExceptionHandler handler 
= Events[EventUnhandledException] as CSExceptionHandler;
InBlock.gif
InBlock.gif              
if (handler != null)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              
dot.gif{
InBlock.gif
InBlock.gif                   handler(csEx,
new CSEventArgs());
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockEnd.gif         
#endregion

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockEnd.gif     }

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif

 

文件太长,我们抓出关键的部分来分析:

None.gif public   delegate   void  CSExceptionHandler(CSException csEx, CSEventArgs e);
None.gif
None.gif

这里先申明一个委托,相当于一个函数指针。在通俗一点理解它就是一个跑腿的,专管传递对象与对象间的调用信息。

接下来:

None.gif internal   static  CSApplication Instance()
None.gif
ExpandedBlockStart.gifContractedBlock.gif         
dot.gif {
InBlock.gif
InBlock.gif              
const string key = "CSApplication";
InBlock.gif
InBlock.gif              CSApplication app 
= CSCache.Get(key) as CSApplication;
InBlock.gif
InBlock.gif              
if(app == null)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              
dot.gif{
InBlock.gif
InBlock.gif                   
lock(sync)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                   
dot.gif{
InBlock.gif
InBlock.gif                       app 
= CSCache.Get(key) as CSApplication;
InBlock.gif
InBlock.gif                       
if(app == null)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                       
dot.gif{
InBlock.gif
InBlock.gif                            CSConfiguration config 
= CSContext.Current.Config;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                            XmlNode node 
= config.GetConfigSection("CommunityServer/CSModules");
InBlock.gif
InBlock.gif                            app 
= new CSApplication();
InBlock.gif
InBlock.gif                            
if(node != null)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                            
dot.gif{
InBlock.gif
InBlock.gif                                 
foreach(XmlNode n in node.ChildNodes)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                                 
dot.gif{
InBlock.gif
InBlock.gif                                     
if(n.NodeType != XmlNodeType.Comment)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                                     
dot.gif{
InBlock.gif
InBlock.gif                                          
switch(n.Name)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                                          
dot.gif{
InBlock.gif
InBlock.gif                                               
case "clear":
InBlock.gif
InBlock.gif                                                   app.modules.Clear();
InBlock.gif
InBlock.gif                                                   
break;
InBlock.gif
InBlock.gif                                               
case "remove":
InBlock.gif
InBlock.gif                                                   app.modules.Remove(n.Attributes[
"name"].Value);
InBlock.gif
InBlock.gif                                                   
break;
InBlock.gif
InBlock.gif                                               
case "add":
InBlock.gif
InBlock.gif                                               
InBlock.gif
InBlock.gif                                                   
string name = n.Attributes["name"].Value;
InBlock.gif
InBlock.gif                                                   
string itype = n.Attributes["type"].Value;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                                                   Type type 
= Type.GetType(itype);
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                                                   
if(type == null)
InBlock.gif
InBlock.gif                                                        
throw new Exception(itype + " does not exist");
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                                                   ICSModule mod 
= Activator.CreateInstance(type) as ICSModule;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                                                   
if(mod == null)
InBlock.gif
InBlock.gif                                                        
throw new Exception(itype + " does not implement ICSModule or is not configured correctly");
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                                                   mod.Init(app, n);
InBlock.gif
InBlock.gif                                                   app.modules.Add(name,mod);
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                                                   
break;
InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockEnd.gif                                          }

InBlock.gif
ExpandedSubBlockEnd.gif                                     }

InBlock.gif
ExpandedSubBlockEnd.gif                                 }

InBlock.gif
ExpandedSubBlockEnd.gif                            }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                            CacheDependency dep 
= new CacheDependency(nullnew string[]dot.gif{CSConfiguration.CacheKey});
InBlock.gif
InBlock.gif                            CSCache.Max(key, app,dep);
InBlock.gif
ExpandedSubBlockEnd.gif                       }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif                       
InBlock.gif
ExpandedSubBlockEnd.gif                   }

InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
InBlock.gif              
return app;
InBlock.gif
ExpandedBlockEnd.gif         }

None.gif
None.gif

这段很重要,通过读取communityserver.config文件的<CSModules>,初始化每个CSModule,注意,初始化后并且调用了这些CSModule中的Init方法。具体看看这些Module中的Init都做了什么,打开CommunityServerComponents项目下的Components文件夹中的CSExceptionModule.cs

None.gif using  System;
None.gif
None.gif
using  System.Web;
None.gif
None.gif 
None.gif
None.gif
namespace  CommunityServer.Components
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif     
/**//// <summary>
InBlock.gif
InBlock.gif     
/// Summary description for CSExceptionModule.
InBlock.gif
ExpandedSubBlockEnd.gif     
/// </summary>

InBlock.gif
InBlock.gif     
public class CSExceptionModule : ICSModule
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif     
dot.gif{
InBlock.gif
InBlock.gif         
public CSExceptionModule()
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              
//
InBlock.gif
InBlock.gif              
// TODO: Add constructor logic here
InBlock.gif
InBlock.gif              
//
InBlock.gif

ExpandedSubBlockEnd.gif         }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif          
ICSModule Members#region ICSModule Members
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
public void Init(CSApplication csa, System.Xml.XmlNode node)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              csa.CSException 
+=new CSExceptionHandler(csa_CSException);
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockEnd.gif         
#endregion

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
private void csa_CSException(CSException csEx, CSEventArgs e)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif              CSContext csContext 
= CSContext.Current;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif              
if (csEx.ExceptionType != CSExceptionType.UnknownError && csContext.IsWebRequest) 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              
dot.gif{
InBlock.gif
InBlock.gif                   RedirectToMessage(csContext.Context, csEx);
InBlock.gif
ExpandedSubBlockEnd.gif              }
 
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif         
private static void RedirectToMessage (HttpContext context, CSException exception) 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif              
if ((exception.InnerException != null&& ( exception.InnerException is CSException)) 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              
dot.gif{
InBlock.gif
InBlock.gif                   CSException inner 
= (CSException) exception.InnerException;
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
InBlock.gif              context.Response.Redirect(Globals.GetSiteUrls().Message( exception.ExceptionType ), 
true);
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockEnd.gif     }

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif

哈哈,原来在Init方法里把一个CSExceptionHandler委托添加到CSException事件上,这个委托指向csa_CSException方法,还是通俗点说:如果CSException这个事件发生了,CSExceptionHandler这个跑腿的委托就会马上告诉csa_CSException方法要他执行,如果事件没有被激发就什么也不做。

名词: event 关键字使您得以指定当代码中的某些“事件”发生时调用的委托。此委托可以有一个或多个关联的方法,当代码指示该事件已发生时将调用关联的方法。

 

那么这个CSException又是怎么回事?在哪里定义的?我们回到CSApplication.cs文件中,看样几行:

None.gif           public   event  CSExceptionHandler CSException
None.gif
ExpandedBlockStart.gifContractedBlock.gif         
dot.gif {
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              add
dot.gif{Events.AddHandler(EventUnhandledException, value);}
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              remove
dot.gif{Events.RemoveHandler(EventUnhandledException, value);}
InBlock.gif
ExpandedBlockEnd.gif     }

None.gif

这里定义了一个CSException事件,而事件发生的时候只能用CSExceptionHandler这个委托来做跑腿的。其实CS中是把委托都存放在了一个EventHandlerList中,因此此处你可以看到addremove,

这是 访问器的声明,用于添加或移除客户代码中的事件处理程序,这样做的好处是公开大量的事件但不为每个事件分配字段,而是使用EventHandlerList存储这些事件实例。为了理解事件的调用执行过程,我们还必须看几个文件:CSEvents.csCSEventArgs.cs

CSEventArgs.cs存储事件的数据,这个很好理解,它继承自EventArgs。当事件发生时CSEventArgs用来传递事件的信息,这里传递两个值:ObjectStateApplicationType(可以在Enumerations文件夹下找到这两个枚举的内容)

CSEvents.cs这是对事件调用的一个包装器,看异常处理的包装:

None.gif           public   static   void  CSException(CSException csEx)
None.gif
ExpandedBlockStart.gifContractedBlock.gif         
dot.gif {
InBlock.gif
InBlock.gif              CSApplication.Instance().ExecuteCSExcetion(csEx);
InBlock.gif
ExpandedBlockEnd.gif          }

None.gif

这里先调用CSApplication.Instance()方法,实例化一个CSApplication对象,如果你是第一次调用Instance()方法,就实例化所有在<CSModules>中配置的类,并且调用他们的Init方法(CSModules中配置的这些类,都实现了ICSModule接口,而这个接口要求继承他的类都具备Init方法),执行Init方法的目的就是把委托添加到事件上,使委托指向的方法可以在事件触发的时候被调用。实例化后再调用ExecuteCSExcetion方法并且传递CSException的实例,ExecuteCSExcetion方法如下:

None.gif           internal   void  ExecuteCSExcetion(CSException csEx)
None.gif
ExpandedBlockStart.gifContractedBlock.gif         
dot.gif {
InBlock.gif
InBlock.gif              CSExceptionHandler handler 
= Events[EventUnhandledException] as CSExceptionHandler;
InBlock.gif
InBlock.gif              
if (handler != null)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              
dot.gif{
InBlock.gif
InBlock.gif                   handler(csEx,
new CSEventArgs());
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
ExpandedBlockEnd.gif         }

None.gif

先通过对EventHandlerList索引访问,即Events[EventUnhandledException],从列表中找到这个CSExceptionHandler事件,如果不为null就执行它。EventUnhandledException又是什么,其实这只是一个Key,用来标示存储的事件。

 

有必要总结一下,不然你会被这种调用来调用去的关系搞得一头雾水,

 

      

 

以异常处理为例:

1:在错误发生后,调用Application_OnError方法;

2:在方法的最后调用CSEvents.CSException(csException)

3:进入CSEvents包装器,调用CSApplication.Instance().ExecuteCSExcetion(csEx);

4:执行CSApplication.Instance()方法,如果是第一次执行就根据communityserver.config文件中的配置,把所有的CSModules实例化,并且调用ICSModule接口类中的Init方法,然后缓存这些实例化的类(如果是第二次访问就从缓存中读取)

5:在实现ICSModule接口的类中,如CSExceptionModule.csInit方法是给事件添加委托的过程,这个过程中实现了委托指向的一个或者多个方法与事件进行关联,异常处理的方法csa_CSException(CSException csEx, CSEventArgs e)就是在这里被关联到异常事件上的。

6:经过上面几步后,CS系统接着调用ExecuteCSExcetion方法,在ExecuteCSExcetion方触发了CSException事件

7CSException事件被触发后,就执行事件中委托所指向的函数,这里是CSExceptionModule.cs文件中的private void csa_CSException(CSException csEx, CSEventArgs e)

 

CS如此大量的使用DelegatesEvents带来了什么,也许你会认为它这样是把问题复杂化,而且觉得这非常没有必要,完全可以在异常处理的最后调用处理方法即可,何必通过事件来回周转!最后说明一下这样做的重要性:

1:通过事件使调用方法者与方法本身隔离,如在CSHttpModule.cs文件中的Application_OnError方法触发CSEvents.CSException事件,而事件要做些什么处理,需要调用什么方法Application_OnError根本不知道。如果你要改变CSEvents.CSException事件处理方法的结构,甚至十处理方法的名称,Application_OnError也不需要改动,因为他根本不关心具体的实现,它的任务只是触发这个事件。

2:如果你想一个方法调用多个方法,普通的做法就是在方法中一次调用或者在方法中嵌套调用。这样做并不是一个好的设计模式,而事件可以通过委托调用多个委托指向的方法(在异常处理中只指向了一个方法,当然你可以指向任意N个方法),而这种调用也是相互隔离的,被调用的方法并不致到谁调用它,而调用者也不关心它调用谁。

3:模块化,你的代码直接没有非常的多紧密联系,而是通过事件来通知处理方法,在CS中又加入了xml的配置文件,使得这样的模块化更突出,你甚至可以把处理异常的类单独编译在一个dll中。

好处还有很多

 

CS中,对Post内容的不良信息过滤也是通过这样的机制完成的,运行的过程基本一致,只是调用不同的事件处理方法,你可以自己分析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值