SPB-附录-SpaceBuilder中的Modules的设计和实现
来自站长百科
导航: 上一页
在数据持久化之前和之后需要做一些操作;
例如:创建文件之前,需要对文件名称和文件描述进行敏感词过滤;在文件创建成功之后,需要产生个人动态和朋友动态;因为这样的事件是可能变化,或者增减的;而且属于创建文件这件事情的一些附属事件;所以为了满足这种变化,SpaceBuilder使用了监听者设计模式;在创建文件成功前和成功后都会触发一系列的事件。以文件为例具体的实现方式:
- 首先定义委托事件:打开文件项目:
如上图所示,文件模块的事件包括三个类:
- FileEventManager:从配置文件中读取节点SpaceBuilder/BlogEventExtensionModules并注册配置的Modules。
- FileEvents:封装了事件的执行。
- IFileModule:定义了文件相关事件的接口;文件相关事件需要继承这个接口。
- 在业务逻辑事件的执行:File/FileThreads.cs CreateFileThread:
FileEvents.BeforeFileThreadChange(fileThread, ObjectState.Create); FileDataProvider.Instance().CreateThread(fileThread); if (fileThread.ThreadID > 0) { ….. } FileEvents.AfterFileThreadChange(fileThread, ObjectState.Create);
如上代码所示:
- 在创建文件之前调用FileEvents的BeforeFileThreadChange;
- 在创建文件成功后调用FileEvents中的AfterFileThreadChange。
- 在表现层是如何定义这些Modules的?
以文件主题和描述文本处理(FileThreadFormatting )为例说明:
namespace SpaceBuilder.File.Modules { /// <summary> /// 文件主题和描述文本处理 /// </summary> class FileThreadFormatting : IFileModule { #region IFileModule 成员 public void Init(FileEventManager em, System.Xml.XmlNode node) { em.BeforeFileThreadChange += new FileThreadEventHandler(em_BeforeFileThreadChange); } void em_BeforeFileThreadChange(FileThread fileThread, SpaceBuilder.Common.GlobalEventArgs e) { // 代码部分 省略 } #endregion }
如上面的代码所示:这里定义的Module继承了IFileModule,并在文件创建之间注册了操作:文件主题和描述文本处理。
另外需要在SpaceBuilder中注册这个Module:web/spacebuilder.config 中:
所在节点 :SpaceBuilder/FileEventExtensionModules:
<FileEventExtensionModules> <add name = "FileThreadFormatting" type = "SpaceBuilder.File.Modules.FileThreadFormatting, SpaceBuilder.File.Web" /> <add name = "FileCommentFormatting" type = "SpaceBuilder.File.Modules.FileCommentFormatting, SpaceBuilder.File.Web" /> <add name = "FileSectionFormatting" type = "SpaceBuilder.File.Modules.FileSectionFormatting, SpaceBuilder.File.Web" /> <add name = "DisposeActivityForFile" type = "SpaceBuilder.File.Modules.DisposeActivityForFile, SpaceBuilder.File.Web" /> <add name = "DisposePointForFile" type = "SpaceBuilder.File.Modules.DisposePointForFile, SpaceBuilder.File.Web" /> <add name = "PrepareForFileThreadIndexModule" type = "SpaceBuilder.LuceneSearch.PrepareForFileThreadIndexModule, SpaceBuilder.File.Web" /> </FileEventExtensionModules>