电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

给IBuySpy构建一个PlugIn系统


发布日期:2022/2/21
 

PlugIn很COOL的特性下面将演示如何给我们的IBuySpy定制一个Page Start PlugIn这个PlugIn可以让用户自己来创建PlugIn嵌入到IBuySpy的Page Start PlugIn里面在网站页面载入的时候会执行用户嵌入的PlugIn

可我们为什么要给IBuySpy创建PlugIn接口呢?我们要实现同样的功能可以直接的修改它的代码岂不是直接很多?原因IBuySpy只是用来演示PlugIn的你可以把同样的技术应用到其他的WebForm甚至WinForm而它们可能并不会像IBuySpy一样是免费的我们交付的产品里面不会附上代码如果我们提供了PlugIn的接口无疑会让我们的产品更加具有扩展性何况很多功能可能可以直接作成PlugIn来嵌入到原有的系统中这个时候无需再改动原有的代码再去编译它

构建IBuySpy的PlugIn所需的接口这些接口就是可以公开给用户代码的

首先需要的是一个通用的IPlugIn接口所有具体的插件将实现这个接口

namespace ASPNetPortalPlugIns {

public interface IPlugIn {

String Name {get;}

String Version {get;}

void DoAction(IPlugInArgs args);

}

}

这个接口有三个成员

Name属性公开插件的名称

Version属性公开插件的版本

DoAction()方法执行插件要做的操作这个方法还有一个IPlugInArgs的参数需要传递给方法所参数可以通过它传递出去

然后就是这个IPlugInArgs接口

namespace ASPNetPortalPlugIns {

public interface IPlugInArgs {

SystemWebHttpContext Context {get;}

Object Data {get;}

}

}

它有两个成员

Context属性一个HttpContext类型的对象如果我们要让插件能够在页面上做些事不给它HttpContext肯定不行

Data属性一个Object类型的对象预留的什么地方需要就什么地方用上

接着是一个接口集合类

namespace ASPNetPortalPlugIns {

public class PlugInCollection : CollectionBase {

public Int Add(IPlugIn plugIn) {

return thisListAdd(plugIn);

}

public IPlugIn this[Int index] {

get {

return (IPlugIn) thisList[index];

}

}

}

}

很简单明了用户可能不止嵌入一个插件

PlugIn也可以有很多类型比如我们这里要实现的Page Start PlugIn是一个在页面载入的时候可以让嵌入的PlugIn执行的当然你也可以创建各种类型的PlugIn

namespace ASPNetPortalPlugIns {

public interface IPageStartPlugIn : IPlugIn {}

}

这个PlugIn接口不需要再做任何事直接继承IPlugIn就可以了

修改IBuySpy让它支持执行PlugIn

根据我们的需求我们创建一个实际的插件参数类这个类继承自IPlugInArgs

namespace ASPNetPortalPlugIns {

public class PlugInArgs : IPlugInArgs {

private SystemWebHttpContext _context;

private Object _data;

public PlugInArgs(SystemWebHttpContext context Object data) {

_context = context;

_data = data;

}

public SystemWebHttpContext Context {

get {

return _context;

}

}

public Object Data {

get {

return _data;

}

}

}

}

[NextPage]

我们需要地方来标示用户嵌入的PlugIn的列表我们放在nfig里面的里面我们加上一项来表示我们要添上的Page Start PlugIn

《ADD key=PageStartPlugIns value= /》

value里面可以写入嵌入的PlugIn的列表格式像这样Value = 插件一的类名 插件一的程序集名; 插件二的类名 插件二的程序集名

然后我们构建一个PlugInHelper类来执行获取PlugIn执行PlugIn的操作

namespace ASPNetPortalPlugIns {

public class PlugInHelper {

private PlugInHelper() {}

public static PlugInCollection GetPlugIns(String plugInType) {

PlugInCollection plugIns = new PlugInCollection();

String sPageStartPlugIns = SystemConfigurationConfigurationSettingsAppSettings[plugInType];

if ((sPageStartPlugIns != null) && (sPageStartPlugIns != )) {

String[] asPlugInStr = sPageStartPlugInsSplit(;); foreach(String plugInStr in asPlugInStr) {

plugInsAdd( (IPageStartPlugIn) SystemActivatorCreateInstance(SystemTypeGetType(plugInStr)));

}

}

return plugIns;

}

public static void ExecutePlugIns(PlugInCollection plugIns IPlugInArgs args) {

foreach(IPlugIn plugIn in plugIns) {

plugInDoAction(args);

}

}

}

}

GetPlugIns()方法返回指定类型的PlugIn的列表返回类型是PlugInCollectionExecutePlugIns()用来执行参数中的PlugIn

最后我们要把执行插件的代码加入到页面的执行队列中为了在每个页面开始的时候能够执行用户嵌入的Page Start Plug标准方法是在Globalasa里面来实现更标准的方法是构建一个httpModule然后在这个httpModule中来执行这个PlugIn(关于构建自定义的httpModule辣椒是个中高手)我这里就偷懒了因为IBuySpy几乎所有的内容页面都是DesktopDefaultaspx这个页面中载入所以我们先在这个页面里面创建一个方法来执行插件

private void PerformPlugIns() {

PlugInCollection plugIns = PlugInHelperGetPlugIns(PageStartPlugIns);

PlugInArgs args = new PlugInArgs(Context null);

PlugInHelperExecutePlugIns(plugIns args);

}

第一句得到所有的Page Start PlugIn第二句创建一个传递给插件的PlugInArgs对象第三句调用PlugInHelperExecutePlugIns()来执行第一句得到的PlugIn队列

在DesktopDefaultaspx的Page_Init事件中调用上面的这个PerformPlugIns()方法就OK了

演示如何创建一个Page Start PlugIn

前面两步已经让IBuySpy可以嵌入用户自定义的Page Start PlugIn了现在我们来做一个实际的PlugIn嵌进去

启动VS创建一个C#类库项目引入IBuySpy的程序集Portaldll这是因为我们需要用到IBuySpy里面的PlugIn相关的那些接口更好的方法是把IBuySpy中与PlugIn相关的公共接口放在一个单独的程序集里面

namespace WelcomeMessage {

public class ShowWelcome : ASPNetPortalPlugInsIPageStartPlugIn {

public string Name {

get {

return Show Page Welcome Message;

}

}

public string Version {

get {

return ;

}

}

public void DoAction(IPlugInArgs args) {

argsContextResponseWrite(<_script_>alert(Hello world!);); // 故意写错了不然

}

}

}

这个ShowWelcome类继承自IPageStartPlugIn表示它是一个Page Start PlugIn用来具体执行操作的DoAction()方法只做了一件事从参数中得到页面相关的HttpContext对象然后输出一段字符以在页面内容载入之前弹出一个Helloworld!的提示框

然后我们修改IBuySpy的nfig里面相关的那句设定

《ADD value=WelcomeMessageShowWelcome WelcomeMessage key=PageStartPlugIns /》

OK了编译把生成的dll放到IBuySpy的bin目录打开浏览器浏览IBuySpy网站你会看到每次载入页面内容时都会弹出一个Helloworld!的提示框

上一篇:如何合并两个结构相同的DataTable

下一篇:通过DataTable获得表的主键