SPB-设计机制-扩展模块

来自站长百科
跳转至: 导航、​ 搜索

导航: 上一页

除了序列化字段以外,扩展模块是SpaceBuilder提供的另外一种扩展机制。可以通过编写自己的扩展模块为SpaceBuilder增加新的功能。

一、设计原理

  • 定义委托、事件:
public delegate void UserEventHandler(User user, GlobalEventArgs e);

    /// <summary>
    /// 创建、更新、删除用户,持久化以后触发的事件
    /// </summary>
    public event UserEventHandler AfterUserChange
    {
        add { Events.AddHandler(EventKey_AfterUserChange, value); }
        remove { Events.RemoveHandler(EventKey_AfterUserChange, value); }
}

来自:SpaceBuilder.Common.GlobalEventManager

  • 定义执行事件的方法,并在相应的业务逻辑类中调用:
    /// <summary>
    /// 创建、更新用户,持久化以后调用
    /// </summary>        
    /// <remarks>删除用户时不允许使用该事件</remarks>
    public static void AfterUserChange(User user, ObjectState state)
    {
        ……        
        GlobalEventManager.Instance().ExecuteAfterUserChange(user, state);
}

来自:SpaceBuilder.Common.GlobalEvents

   /// <summary>
   /// 创建用户
   /// </summary>
  public static CreateUpdateUserStatuses Create(User user, bool sendEmail, bool ignoreDisallowNames)
   {    ……
       //执行BeforeUser事件
       GlobalEvents.BeforeUserChange(user, ObjectState.Create);
	   ……
       //执行AfterUser事件
       GlobalEvents.AfterUserChange(createdUser, ObjectState.Create);
       return status;
}

来自:SpaceBuilder.Common.Users

  • 定义附加模块接口,该接口包含一个Init方法,实现该接口的类中需要对步骤1中的事件注册新的事件处理程序:
/// <summary>
    /// 全局事件Module接口
    /// </summary>
    public interface IGlobalModule
    {
        void Init(GlobalEventManager gem, XmlNode node);
}

来自:SpaceBuilder.Common.IGlobalModule

  • 开发附加模块并实现附加模块接口:
   /// <summary>
    /// 个人用户注册,自动创建博客
    /// </summary>
    public class AutoCreateBlog : IGlobalModule
    {
        /// <summary>
        /// 初始化(实现IGlobalModule中的方法)
        /// </summary>
       public void Init(GlobalEventManager pa, XmlNode node)
        {
            pa.AfterUserChange += new UserEventHandler(pa_PostUserUpdate);
        }
/// <summary>
        /// 自动创建用户博客
        /// </summary>
        private void pa_PostUserUpdate(User user, GlobalEventArgs e)
        {
            if (user != null && user.UserType == UserTypes.PersonUser && e.State == ObjectState.Create)
            {
                WeblogConfiguration config = WeblogConfiguration.Instance();
                if (config.EnableAutoCreate)
                {
                    Weblog w = new Weblog();
                    w.OwnerUserID = user.UserID;
                    w.WeblogName = user.DisplayName + "的博客";
                    w.IsActive = true;
                    w.EnableSearch = true;
                    w.EnableAggBugs = true;
                    //Create The Blog
                    Weblogs.Create(w);
                }
            }
        }
    }

来自:SpaceBuilder.Blog.Modules.AutoCreateBlog

  • 在配置文件配置附加模块:

在SpaceBuilder.config的GlobalEventExtensionModules节点配置AutoCreateBlog

{<}}GlobalEventExtensionModules>
<add name = "AutoCreateBlog" type="SpaceBuilder.Blog.Modules.AutoCreateBlog, SpaceBuilder.Blog.Web" />
	</GlobalEventExtensionModules>
  • 对配置文件的附加模块实例化,并且调用Init方法:
/// <summary>
    /// 创建实例
    /// </summary>
    /// <returns>返回一个GlobalEventManager的实例</returns>
    internal static GlobalEventManager Instance()
    {
SPBCacheManager cacheManager = SPBCacheManagerFactory.GetCacheManager
(CacheManagerNames.Instance().Configuration());
        const string key = "CacheKey_GlobalEventManager";
        GlobalEventManager app = cacheManager.Get(key) as GlobalEventManager;
        if (app == null)
        {
            lock (sync)
            {
                app = cacheManager.Get(key) as GlobalEventManager;
                if (app == null)
                {
                    SPBConfig config = SPBConfig.Instance();
XmlNode node = config.GetConfigSection("SpaceBuilder/GlobalEventExtensionModules");             
       app = new GlobalEventManager();
                    if (node != null)
                    {
                        foreach (XmlNode n in node.ChildNodes)
                        {
                            if (n.NodeType != XmlNodeType.Comment)
                            {
                                switch (n.Name)
                                {
                                    …
                                   case "add":
                                       string name = n.Attributes["name"].Value;
                                       string itype = n.Attributes["type"].Value;
                                       Type type = Type.GetType(itype);
                                     if (type == null)
                                        throw new Exception(itype + " does not exist");
                                        IGlobalModule mod = Activator.CreateInstance(type) as IGlobalModule;
                                      if (mod == null)
                                        
throw new Exception(itype + "does not implement IGlobalModule or is not configured correctly");
mod.Init(app, n);
           app.modules[name] = mod;
           break;
                          }
  						}
                    	   }
                   }
cacheManager.Add(key, app, config.ConfigFullFilePath);                
               }
           }
       }
return app;
   }
#endregion来自:SpaceBuilder.Common.GlobalEventManager

二、典型用途

  1. 用户的blog、FileSection…自动创建;
  2. 积分的实现;
  3. 通知、动态的实现;
  4. 帖子内容的敏感词的清除、非法html/javascript代码的清除;
  5. 全文检索中需要生成索引数据的记录;

参考资料[ ]