帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统v4.6
栏 目:
 
您的位置:首页 > 技术文档 > ASP.NET编程 >
给IBuySpy构建一个PlugIn系统
作者:kaneboy 发布时间:2005-03-12 来源:ASPCOOL
     话说公元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!”的提示框。
  
  kaneboy's blog: http://blog.joycode.com/kaneboy/
  

  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
无相关信息

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·帝国网站管理系统采集使用教程
·帝国网站管理系统模板制作教程
·帝国CMS模板下载
·Discuz6.0.1UC版通行证发布
·帝国网站管理系统之网站迁移教程
·帝国网站管理系统实例入门教程下载
·《帝国网站管理系统》实例入门教程
   类别最新
·ASP.NET中为DataGrid添加合计字段
·.text urlRewrite介绍
·利用 ASP.NET 的内置功能抵御 Web
·ASP.NET Cache
·用 WebClient.UploadData 方法 上载
·ASP.NET 程序设计-序
·什么是客户端/伺服端(Client/Serve
·因特网应用程序的开发
·网页的种类
·.NET Framework-Microsoft Visual
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统