在开始自己系统的同时,总想将系统做得更灵活,可让其他人非常方便地参与进来,这就需要一个完善的插件系统,今天我准备写一个插件框架系列的文章,主要是想记录下我学习 ScrewTurn Wiki 系统的成果,也方便需要的人查阅
我个人感觉 ScrewTurn Wiki 系统的插件框架做得相当好,可让后期制作插件的人方便地将系统进行整合,所以这段时间都在研究。现大概说一下一个插件框架的架构和需求吧。 我认为一个插件系统,应该可以独立于现有系统的类库,让第三方开发者只引用一个插件项目的DLL即可完成所有相关的开发,而且对系统框架要有一定的、统一的约定,不能让第三方开发者想怎样设计就怎样设计,因此一般的插件框架都是接口来实现会比较好,以下将说说大致的调用流程,呵,我就不画流程图啦(主要是我也懒得安装 ),只用文字说明一下吧:
用户访问网站 --> 调用核心功能函数 --> 调用实现此核心功能的接口
因此通过实现不同的接口,就可以方便地实现不同的功能函数,也达到了实现不同插件的效果,这个道理很简单,只要有接触过OO的人都会知道,但具体要如何实现呢,以下将慢慢道来。 此插件框架主要使用了接口+Provider模式实现,因此需先设计好要被实现的接口,以下仅以一个格式化的功能为例吧,此格式化功能插件主要是在文章发布后对内容进行格式化处理,如可为此创建代码高亮插件、查看次数插件等,都是在文章输出时调用不同的格式化插件进行处理即可。 OK,第一步我们先定义好一个全局总的 IProvider 接口,好让之后所有插件都基于这些接口进行:
IProvider.cs 文件:
namespace CoderBlog.PluginFramework
{
public interface IProvider
{
/// <summary>
/// 初始化插件
/// </summary>
/// <param name="host">主系统对象,可让插件调用主系统里的方法,以达到解耦合</param>
/// <param name="config">插件配置文件</param>
void Init(IHost host, string config);
/// <summary>
/// 当注销插件时调用
/// </summary>
void Shutdown();
/// <summary>
/// 插件开发者相关信息
/// </summary>
PluginInfo Information { get; }
/// <summary>
/// 插件帮助信息
/// </summary>
string ConfigHelpHtml { get; }
}
}
{
public interface IProvider
{
/// <summary>
/// 初始化插件
/// </summary>
/// <param name="host">主系统对象,可让插件调用主系统里的方法,以达到解耦合</param>
/// <param name="config">插件配置文件</param>
void Init(IHost host, string config);
/// <summary>
/// 当注销插件时调用
/// </summary>
void Shutdown();
/// <summary>
/// 插件开发者相关信息
/// </summary>
PluginInfo Information { get; }
/// <summary>
/// 插件帮助信息
/// </summary>
string ConfigHelpHtml { get; }
}
}