欢迎光临
我们一直在努力

给IBuySpy构建一个PlugIn系统-.NET教程,Asp.Net开发

建站超值云服务器,限时71元/月

话说公元2003年12月17日,msdn library网站上悄无声息的多了一篇文章,介绍了关于构建一个plugin framework的一些基础知识,于是,有了这篇随笔…
  
  plugin,很cool的特性,下面将演示如何给我们的ibuyspy定制一个page start plugin,这个plugin可以让用户自己来创建plugin,嵌入到ibuyspy的page start plugin里面,在网站页面载入的时候,会执行用户嵌入的plugin。
  
  可我们为什么要给ibuyspy创建plugin接口呢?我们要实现同样的功能,可以直接的修改它的代码,岂不是直接很多?原因:ibuyspy只是用来演示plugin的,你可以把同样的技术应用到其他的webform甚至winform,而它们可能并不会像ibuyspy一样是免费的,我们交付的产品里面不会附上代码,如果我们提供了plugin的接口,无疑会让我们的产品更加具有扩展性。何况很多功能可能可以直接作成plugin来嵌入到原有的系统中,这个时候无需再改动原有的代码,再去编译它。
  
  1、构建ibuyspy的plugin所需的接口,这些接口就是可以公开给用户代码的:
  
  首先需要的是一个通用的iplugin接口,所有具体的插件将实现这个接口:
  
  namespace aspnetportal.plugins {
  
   public interface iplugin {
   string name {get;}
   string version {get;}
   void doaction(ipluginargs args);
   }
  }
  
  这个接口有三个成员:
  name属性,公开插件的名称
  version属性,公开插件的版本
  doaction()方法,执行插件要做的操作,这个方法还有一个ipluginargs的参数,需要传递给方法所参数可以通过它传递出去。
  
  然后就是这个ipluginargs接口:
  
  namespace aspnetportal.plugins {
  
   public interface ipluginargs {
   system.web.httpcontext context {get;}
   object data {get;}
   }
  }
  
  它有两个成员:
  context属性,一个httpcontext类型的对象,如果我们要让插件能够在页面上做些事,不给它httpcontext肯定不行。
  data属性,一个object类型的对象,预留的,什么地方需要就什么地方用上。
  
  接着是一个接口集合类:
  
  namespace aspnetportal.plugins {
  
   public class plugincollection : collectionbase {
  
   public int32 add(iplugin plugin) {
   return this.list.add(plugin);
   }
  
   public iplugin this[int32 index] {
   get {
   return (iplugin) this.list[index];
   }
   }
   }
  }
  
  很简单明了。用户可能不止嵌入一个插件。
  
  plugin也可以有很多类型,比如我们这里要实现的page start plugin,是一个在页面载入的时候可以让嵌入的plugin执行的。当然你也可以创建各种类型的plugin。
  
  namespace aspnetportal.plugins {
  
   public interface ipagestartplugin : iplugin {}
  }
  
  这个plugin接口不需要再做任何事,直接继承iplugin就可以了。
  
  2、修改ibuyspy,让它支持执行plugin:
  
  根据我们的需求,我们创建一个实际的插件参数类,这个类继承自ipluginargs:
  
  namespace aspnetportal.plugins {
  
   public class pluginargs : ipluginargs {
   private system.web.httpcontext _context;
   private object _data;
  
   public pluginargs(system.web.httpcontext context, object data) {
   _context = context;
   _data = data;
   }
  
   public system.web.httpcontext context {
   get {
   return _context;
   }
   }
  
   public object data {
   get {
   return _data;
   }
   }
   }
  }
  
  我们需要地方来标示用户嵌入的plugin的列表,我们放在web.config里面的里面,我们加上一项,来表示我们要添上的page start plugin:
  
  《add key=”pagestartplugins” value=”” /》
  
  value里面可以写入嵌入的plugin的列表,格式像这样:value = “插件一的类名, 插件一的程序集名; 插件二的类名, 插件二的程序集名”
  
  然后,我们构建一个pluginhelper类,来执行获取plugin、执行plugin的操作:
  
  namespace aspnetportal.plugins {
  
   public class pluginhelper {
  
   private pluginhelper() {}
  
   public static plugincollection getplugins(string plugintype) {
   plugincollection plugins = new plugincollection();
   string spagestartplugins = system.configuration.configurationsettings.appsettings[plugintype];
   if ((spagestartplugins != null) && (spagestartplugins != “”)) {
   string[] aspluginstr = spagestartplugins.split(;); foreach(string pluginstr in aspluginstr) {
   plugins.add( (ipagestartplugin) system.activator.createinstance(system.type.gettype(pluginstr)));
   }
   }
   return plugins;
   }
  
   public static void executeplugins(plugincollection plugins, ipluginargs args) {
   foreach(iplugin plugin in plugins) {
   plugin.doaction(args);
   }
   }
   }
  }
  
  getplugins()方法返回指定类型的plugin的列表,返回类型是plugincollection,executeplugins()用来执行参数中的plugin。
  
  最后,我们要把执行插件的代码加入到页面的执行队列中。为了在每个页面开始的时候能够执行用户嵌入的page start plug,标准方法是在global.asa里面来实现,更标准的方法是构建一个httpmodule,然后在这个httpmodule中来执行这个plugin(关于构建自定义的httpmodule,辣椒是个中高手)。我这里就偷懒了,因为ibuyspy几乎所有的内容页面都是desktopdefault.aspx这个页面中载入,所以我们先在这个页面里面创建一个方法来执行插件:
  
  private void performplugins() {
   plugincollection plugins = pluginhelper.getplugins(“pagestartplugins”);
   pluginargs args = new pluginargs(context, null);
   pluginhelper.executeplugins(plugins, args);
  }
  
  第一句得到所有的page start plugin,第二句创建一个传递给插件的pluginargs对象,第三句调用pluginhelper.executeplugins()来执行第一句得到的plugin队列。
  
  在desktopdefault.aspx的page_init事件中调用上面的这个performplugins()方法就ok了。
  
  3、演示如何创建一个page start plugin:
  
  前面两步已经让ibuyspy可以嵌入用户自定义的page start plugin了,现在我们来做一个实际的plugin嵌进去。
  
  启动vs,创建一个“c#类库”项目,引入ibuyspy的程序集portal.dll,这是因为我们需要用到ibuyspy里面的plugin相关的那些接口,更好的方法是把ibuyspy中与plugin相关的公共接口放在一个单独的程序集里面。
  
  namespace welcomemessage {
  
   public class showwelcome : aspnetportal.plugins.ipagestartplugin {
  
   public string name {
   get {
   return “show page welcome message”;
   }
   }
  
   public string version {
   get {
   return “1.0.0.1”;
   }
   }
  
   public void doaction(ipluginargs args) {
   args.context.response.write(“<_script_>alert(‘hello, world!’);”); // 故意写错了,不然…
  }
  }
  }
  
  这个showwelcome类继承自ipagestartplugin,表示它是一个page start plugin,用来具体执行操作的doaction()方法只做了一件事,从参数中得到页面相关的httpcontext对象,然后输出一段字符以在页面内容载入之前弹出一个“hello,world!”的提示框。
  
  然后我们修改ibuyspy的web.config里面相关的那句设定:
  
  《add value=”welcomemessage.showwelcome, welcomemessage” key=”pagestartplugins” /》
  
  ok了,编译,把生成的dll放到ibuyspy的bin目录,打开浏览器浏览ibuyspy网站,你会看到每次载入页面内容时,都会弹出一个“hello,world!”的提示框。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 给IBuySpy构建一个PlugIn系统-.NET教程,Asp.Net开发
分享到: 更多 (0)