Welcome 微信登录

首页 / 网页编程 / ASP.NET / BlogEngine.Net架构与源代码分析系列part10:开发扩展(中)

BlogEngine.Net架构与源代码分析系列part10:开发扩展(中)2012-02-01 cnblogs GUO XingwangWidget小工具

上篇文章我向大家介绍了BlogEngine.Net中开发扩展的重要一部分——Extension。在本文中我将向大家展示它的另外一种扩展特性,那就是Widget小工具,主要是Widget的开发标准和工作原理等。

什么是Widget与为什么要使用Widget

Widget实际上就是一种带有界面的小工具,主要应用在桌面领域,例如:Yahoo!Widget,还有Vista自带的边栏等。在BlogEngine.Net中它就是页面左侧或右侧的那种小的分区,例如Category list,Calendar,Tag cloud等,这种东西实际上在很多Blog系统中都存在,在BlogEngine.Net中我们就叫它Widget。

Widget可以将Blog系统中很多的功能提供给用户一个统一的界面访问接口。如果有一些功能需要加到页面上,我们首先考虑的就是可否作成一个Widget来实现,因为这种Widget具有统一的开发标准,可以很方便的达到我们的目的。

WidgetBase和WidgetEditBase

在BlogEngine.Net中,作为一个有界面的Widget我们只需要继承WidgetBase类就行了。WidgetBase直接继承了UserControl,重写了Render用来生成统一的Widget界面,至于具体Widget中显示什么,则由自定义Widget类本身来完成,WidgetBase中有一个抽象方法LoadWidget用来完成Widget对象的初始化工作,IsEditable用于说明Widget是否可以编辑,如果可以编辑在Render时就会输出编辑按钮,那么这个Widget也必须提供一个编辑界面(继承了WidgetEditBase)。此外还需要注意WidgetBase中GetSettings会根据WidgetID从DataStore(前文讲述过)中获得相应的配置信息(也就是内容信息)并存储在Cache中。Cache在这部分的DataStore的处理中运用很多,希望大家留意。

如果某个Widget可以编辑,那么它还需要一个实现WidgetEditBase的类,这个类主要是给用户提供一个对于Widget配置信息(具体内容)修改的界面,它提供了一个抽象的Save方法用于将修改的信息保存到DataStore中,还有一个Saved事件用于外部监听以便进行扩展。

所有已经实现的Widget必须放在widgets目录下,并以Widget的名称给相应的文件夹命名,如果只是浏览我们加入一个widget.ascx就行了,如果需要修改还需要加入一个edit.ascx,以TextBox(可以设置一些关于作者的描述信息)的实现为例:

在widgetsTextBox中有widget.ascx和edit.ascx两个文件(加上Codebehind一共四个),在widget.ascx.cs的LoadWidget(重写父类的方法)获得DataStore信息并加入到Widget内容中。

1/**//// <summary>
2/// This method works as a substitute for Page_Load. You should use this method for
3/// data binding etc. instead of Page_Load.
4/// </summary>
5public override void LoadWidget()
6{
7StringDictionary settings = GetSettings();
8if (settings.ContainsKey("content"))
9{
10LiteralControl text = new LiteralControl(settings["content"]);
11this.Controls.Add(text);
12}
13}
14
15/**//// <summary>
16/// Gets the name. It must be exactly the same as the folder that contains the widget.
17/// </summary>
18/// <value></value>
19public override string Name
20{
21get { return "TextBox"; }
22}
23
24/**//// <summary>
25/// Gets wether or not the widget can be edited.
26/// <remarks>
27/// The only way a widget can be editable is by adding a edit.ascx file to the widget folder.
28/// </remarks>
29/// </summary>
30/// <value></value>
31public override bool IsEditable
32{
33get { return true; }
34}
35