站长百科 | 数字化技能提升教程 数字化时代生存宝典
首页
数字化百科
电子书
建站程序
开发
服务器
办公软件
开发教程
服务器教程
软件使用教程
运营教程
热门电子书
WordPress教程
宝塔面板教程
CSS教程
Shopify教程
导航
程序频道
推广频道
网赚频道
人物频道
网站程序
网页制作
云计算
服务器
CMS
论坛
网店
虚拟主机
cPanel
网址导航
WIKI使用导航
WIKI首页
最新资讯
网站程序
站长人物
页面分类
使用帮助
编辑测试
创建条目
网站地图
站长百科导航
站长百科
主机侦探
IDCtalk云说
跨境电商导航
WordPress啦
站长专题
网站推广
网站程序
网站赚钱
虚拟主机
cPanel
网址导航专题
云计算
微博营销
虚拟主机管理系统
开放平台
WIKI程序与应用
美国十大主机
编辑“
SPB-设计机制-扩展模块
”
人物百科
|
营销百科
|
网赚百科
|
站长工具
|
网站程序
|
域名主机
|
互联网公司
|
分类索引
跳转至:
导航
、
搜索
警告:
您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您
登录
或
创建
一个账户,您的编辑将归属于您的用户名,且将享受其他好处。
反垃圾检查。
不要
加入这个!
<span style="text-align:center; border:1px solid #000; float:right; padding:6px;"><strong>导航:</strong> [[SpaceBuilde二次开发手册|上一页]]</span> <div style="clear:both;"></div> 除了序列化字段以外,扩展模块是[[SpaceBuilder]]提供的另外一种扩展机制。可以通过编写自己的扩展模块为SpaceBuilder增加新的功能。 '''一、设计原理''' *定义委托、事件: <pre> 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); } } </pre> '''来自''':SpaceBuilder.Common.GlobalEventManager *定义执行事件的方法,并在相应的业务逻辑类中调用: <pre> /// <summary> /// 创建、更新用户,持久化以后调用 /// </summary> /// <remarks>删除用户时不允许使用该事件</remarks> public static void AfterUserChange(User user, ObjectState state) { …… GlobalEventManager.Instance().ExecuteAfterUserChange(user, state); } </pre> '''来自''':SpaceBuilder.Common.GlobalEvents <pre> /// <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; } </pre> '''来自''':SpaceBuilder.Common.Users *定义附加模块接口,该接口包含一个Init方法,实现该接口的类中需要对步骤1中的事件注册新的事件处理程序: <pre> /// <summary> /// 全局事件Module接口 /// </summary> public interface IGlobalModule { void Init(GlobalEventManager gem, XmlNode node); } </pre> '''来自''':SpaceBuilder.Common.IGlobalModule *开发附加[[模块]]并实现附加模块接口: <pre> /// <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); } } } } </pre> '''来自''':SpaceBuilder.Blog.Modules.AutoCreateBlog *在配置文件配置附加模块: 在SpaceBuilder.config的GlobalEventExtensionModules节点配置AutoCreateBlog <pre> {<}}GlobalEventExtensionModules> <add name = "AutoCreateBlog" type="SpaceBuilder.Blog.Modules.AutoCreateBlog, SpaceBuilder.Blog.Web" /> </GlobalEventExtensionModules> </pre> *对配置文件的附加模块实例化,并且调用Init方法: <pre> /// <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 </pre> '''二、典型用途''' #用户的[[blog]]、FileSection…自动创建; #积分的实现; #通知、动态的实现; #帖子内容的敏感词的清除、非法[[html]]/[[javascript]]代码的清除; #[[全文检索]]中需要生成索引数据的记录; ==参考资料== *[http://doc.spacebuilder.cn SpaceBuilder官方] [[category:SpaceBuilder|S]]
摘要:
请注意,您对站长百科的所有贡献都可能被其他贡献者编辑,修改或删除。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅
Wordpress-mediawiki:版权
的细节)。
未经许可,请勿提交受版权保护的作品!
取消
编辑帮助
(在新窗口中打开)