在一些应用系统中,经常要用到一些需要在后台自动执行的服务,基于这个,我设计了一个通用的window服务框架。包含三部分
1、服务程序:服务的启动,停止,业务插件库的加载。
2、调度监控:独立的线程,对其他业务插件库定时检测状态,对需要有定时任务的插件触发事件。
3、更新服务:自动从服务器升级和更新新的插件库,实现自动加载插件,自动可以关闭正在运行的对应插件,然后再加载,再启动。所有的插件都可以自动发现。
通过插件式服务可以随意增加新的任务,彼此之间独立。
实现过程:
(1)设计插件接口
1
namespace SVC.PluginInterface2


{3
public enum eTaskType4

{5
Task_None,6
Task_Once,//一次性任务7
Task_Timer,//定时性任务8
Task_Permanent//持久性任务9
}10

11
public enum eTaskStatus12

{13
Task_New,14
Task_Proccesing,15
Task_End,16
Task_Idle17
}18
public interface IPlugin19

{20
21
22

string Name
{get;}23

string Description
{get;}24

string Author
{get;}25

string Version
{get;}26

/**//// <summary>27
/// 执行任务28
/// </summary>29
/// <returns></returns>30
31
/// <summary>32
/// 判断任务当前状态33
/// </summary>34
eTaskStatus GetTaskStatus();35
eTaskType GetTaskType();36
//接口 执行任务37
bool DoTask();38
//初始化数据39
void Initialize();40
void Dispose();41
42
}43
44
}45

Initialize()函数相当于构造函数,做插件初始化
DoTask()执行对应的业务功能,建议在这个接口实现类中启动一个业务线程,不要在这里执行业务功能。
Dispose()插件卸载时执行清理
(2)主服务程序
主服务程序很简单,.net可以基本实现,在主程序中建立一个插件服务类(PluginServices)
class PluginServices
{

private SVC.PluginInterface.IPlugin[] plugins;
public void LoadPlugIns(string sPath)
{
string[] p = Directory.GetFiles(sPath,"*.dll");
plugins = new SVC.PluginInterface.IPlugin[p.Length];
for (int i = 0; i < plugins.Length; i++)
{
Assembly asm = Assembly.LoadFrom(p[i]);
// Must be a full-qualified name (MyNamespace.IPlugin)
plugins[i] = (SVC.PluginInterface.IPlugin)Activator.CreateInstance(type);
plugins[i].Initialize();
}
}
public void Run()
{
for (int i = 0; i < plugins.Length; i++)
{
//HVCLib.PluginInterface.eTaskType etype = plugins[i].GetTaskType();
plugins[i].DoTask();

}
}
这个类实现了插件库的加载和运行
在服务程序中建立。
下一篇写一个插件库
posted @ 2007-04-19 19:31 HappyCode 阅读(226) 评论(0) 编辑

