创建插件框架(2)

原创 2004年04月12日 12:27:00

创建插件框架(2)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

标题:Create a Plug-In FrameWork

作者:Roy Osherove

译者:easyjoy

出处:MSDN Online,链接为

http://msdn.microsoft.com/asp.net/archive/default.aspx?pull=/library/en-us/dnaspp/html/pluginframework.asp

摘要:介绍如何为.Net应用程序添加插件支持,并提供一个用来框架例子。

 

代码下载:链接为

http://download.microsoft.com/download/7/2/e/72e64769-58d2-4a91-9686-a1a160bb1bc8/CreatePluginFramework.msi

 

第四步:让应用程序找到新插件

编译好插件后,如何让应用程序知道呢?解决办法很简单:

1)创建应用程序配置文件;

2)在配置文件中创建一项来列出所有插件;

3)创建解析器来解析该项;

 

要完成(1),只需向主程序添加一个XML文件。

 

Tip给该文件取名为App.Config,这样,每次编译程序的时候,Visual Studio.Net会自动把该文件复制到目标文件夹,并改名为<YourApp>.Config

 

现在插件编写者可以很容易的往配置文件中添加一下。下面是这个配置文件的样子:

 

<configuration>

<configSections>

      <section name="plugins"

            type="Royo.PluggableApp.PluginSectionHandler, PluggableApp"

            />

</configSections>

   <plugins>

      <plugin type="Royo.Plugins.Custom.EmailPlugin, CustomPlugin" />

   </plugins>

</configuration>

 

注意到configSections标签,该标签说明应用程序配置中有一个plugins项,而且有一个解析器专门解析plugins项。该解析器在类Royo.PluggableApp.PluginSectionHandler中,装配件的名字是PluggableApp。下一步中将展示这个类的代码。

 

接着,配置文件中有plugins标签,这列出所有的插件,包括类名和装配件名。

 

配置文件写好之后,就已经完成一半任务。剩下的是应用程序要读配置信息,并实例化插件。

 

第五步:用IConfigurationSectionHandler解析配置文件

为了解析出配置文件中的插件信息,框架提供了一个很简单的机制,使得你可以注册一个类作为配置文件中某个特定部分的处理器。对于配置文件中的某个部分,如果框架不能解析,那么就需要一个专门的处理器;否则应用程序会抛出ConfigurationException

 

为了提供解析plug-ins 项的类,需要实现下面这个接口,这个接口很简单,代码如下:

 

//System.Configuration.IConfigurationSectionHandler

public interface IConfigurationSectionHandler

{

   public object Create(object parent, object configContext, System.Xml.XmlNode section);

}

 

我们所要做的就是覆写Create方法,在这个方法中解析XML节点。在这里,要解析的节点是“Plugins”节点。这个类还需要有一个缺省的构造函数,这样框架可以动态实例化它。类的代码如下:

 

public class PluginSectionHandler:IConfigurationSectionHandler

{

   public PluginSectionHandler()

   {

   }

   // Iterate through all the child nodes

   //   of the XMLNode that was passed in and create instances

   //   of the specified Types by reading the attribite values of the nodes

   //   we use a try/Catch here because some of the nodes

   //   might contain an invalid reference to a plugin type

   public object Create(object parent,

         object configContext,

         System.Xml.XmlNode section)

   {

      PluginCollection plugins = new PluginCollection();

      foreach(XmlNode node in section.ChildNodes)

      {

         //Code goes here to instantiate

         //and invoke the plugins

         .

         .

         .

      }

      return plugins;

   }

}

 

如前面提到的,你提供框架需要的信息来处理configSection标签中的plug-ins项,该项在时间的plug-ins标签之前。

<configuration>

<configSections>

   <section name="plugins"

      type="Royo.PluggableApp.PluginSectionHandler, PluggableApp"

   />

</configSections>

...

 

看看上面是如何指定类的。对于的字符串有两部分组成,一个是类的全名(包括名字空间),逗号,所在的装配件。这就是框架用来实例化一个类所需要的信息,也是实例化一个插件所需要的信息。

 

实例化并调用插件

OK,根据下面这段代码,我们该如何实例化插件呢?

String ClassName = "Royo.Plugins.MyCustomPlugin, MyCustomPlugin"

IPlugin plugin =  (IPlugin )Activator.CreateInstance(Type.GetType(ClassName));

 

这里发生了哪些事情呢:由于应用程序没有直接引用插件所在的装配件,所以必须要用System.Activator类。Activator是一个特殊的类,用来根据任意数量的参数来产生某个对象的实例。如果用过ASP或者Visual Basic,也许你记得用过CreateObject()函数,根据某个类的CLSID来实例化并返回某个对象。Activator也是同样的思路,只不过是用不同的参数,返回的是一个System.Object对象,而不是一个variant

 

调用Activator的时候,传入的参数是一个类型(Type)。用Type.GetType()方法返回符合插件类型的类型的实例。注意Type.GetType()plug-ins中的字符串作为参数,这个参数描述了所需要的类和装配件。

 

实例化插件后,要强制转换成IPlugin。这里需要一个TryCatch块,这是为了确保类的确实现了IPlugin接口。获取接口实例后就保存下来,然后继续下一个XML节点。代码如下:

 

public object Create(object parent,

    object configContext,

    System.Xml.XmlNode section)

{

   //Derived from CollectionBase

   PluginCollection plugins = new PluginCollection();

   foreach(XmlNode node in section.ChildNodes)

   {

      try

      {

         //Use the Activator class's 'CreateInstance' method

         //to try and create an instance of the plugin by

         //passing in the type name specified in the attribute value

         object plugObject =

                   Activator.CreateInstance(Type.GetType(node.Attributes["type"].Value));

 

         //Cast this to an IPlugin interface and add to the collection

         IPlugin plugin = (IPlugin)plugObject;

         plugins.Add(plugin);

      }

      catch(Exception e)

      {

         //Catch any exceptions

         //but continue iterating for more plugins

      }

   }

   return plugins;

}

 

调用插件

现在可以调用插件了。别忘了要传入一个IPluginContext参数。该参数包含插件正常工作所需要的信息。因此需要一个类实现该接口。代码如下:

public interface IPluginContext

{

   string CurrentDocumentText{get;set;}

}

 

public class EditorContext:IPluginContext

{

   private string m_CurrentText= string.Empty;

   public EditorContext(string CurrentEditorText)

   {

      m_CurrentText = CurrentEditorText;

   }

 

   public string CurrentDocumentText

   {

get{return m_CurrentText;}

      set{m_CurrentText = value;}

   }

}

 

下面就可以调用插件了:

private void ExecutePlugin(IPlugin plugin)

{

   //create a context object to pass to the plugin

   EditorContext context = new EditorContext(txtText.Text);

  

   //The plugin Changes the Text property of the context

   plugin.PerformAction(context);

   txtText.Text= context.CurrentDocumentText;

   }

}

 

总结

(略)

 

【完】

play框架2.5.6教程——设置你喜欢的IDE

用Play操作很简单,你甚至不需要一个复杂的IDE,因为Play会自动地编译和更新你对你的资源所做的修改。所以你可以使用一个简单的文本编辑器进行操作。 然而使用一个现代的Java或者Scala I...
  • Java_Mike
  • Java_Mike
  • 2016年09月11日 15:47
  • 3418

【SSH三大框架】Struts2基础第八篇:Struts2用AJAX实现JSON插件的使用

AJAX的详细描述就不做介绍了,大家基本都懂这个。 下面我们会通过两个具体的案例,来做具体的实现: 案例一: 案例描述:输入用户名,把用户名通过AJAX异步传输的方式发送至后台,判断此用户名是否存在。...
  • u010800530
  • u010800530
  • 2014年08月30日 14:12
  • 2202

主流插件框架分析

前言目前移动端产品功能越来越复杂,模块不断增加,APK体积也不断增长。由于Android Dalvik最初设计的问题,单个.dex文件方法数最多是65536个。因此,APK难免会遇到64K方法数限制的...
  • mountains2001
  • mountains2001
  • 2017年03月10日 14:35
  • 891

插件框架如何设计

读了 goldboar的平台+插件软件设计思想及基于COM的原型实现,再加上自己的软件的需求,感觉很有必要将自己的软件设计成插件更新的方式。 平台+插件软件设计基本思想   插件的本质在于不修...
  • andylau00j
  • andylau00j
  • 2014年04月17日 17:54
  • 1115

基于插件式的开发框架

转载地址:http://guojun2sq.blog.163.com/blog/static/64330861201002010314694/ http://www.cnblogs.com/mix-...
  • xiayefanxing
  • xiayefanxing
  • 2013年03月07日 10:04
  • 18422

Delphi插件管理框架的简单实现

1 前言 1.1 插件技术许多软件采用“插件”(PlugIns)来扩展其功能,比如PhotoShop所支持的各类滤镜就是插件;我们所熟知的Winamp,也有许多皮肤以及可视效果插件。...
  • xieyunc
  • xieyunc
  • 2017年03月19日 13:34
  • 1138

java 插件程序开发框架-jpf

一、jpf http://jpf.sourceforge.net/ JPF provides a runtime engine that dynamically discovers and loa...
  • earbao
  • earbao
  • 2013年11月22日 10:17
  • 3485

【OSGI】2.走近OSGI-开发第一个Plug-in项目

上一次我们介绍了什么是OSGI和OSGI在我们的项目中起到了什么作用。这次我们来亲手使用OSGI技术。 主要利用Eclipse开发工具提供给我们的plug-in插件工程模板来创建我们的工程。零距离的...
  • u013517797
  • u013517797
  • 2016年03月16日 12:48
  • 5193

Android 使用动态加载框架DL进行插件化开发

概述: 随着应用的不断迭代,应用的体积不断增大,项目越来越臃肿,冗余增加.项目新功能的添加,无法确定与用户匹配性,发生严重异常往往牵一发而动全身,只能紧急发布补丁版本,强制用户进行更...
  • t12x3456
  • t12x3456
  • 2014年10月20日 00:06
  • 69953

Android插件化框架总结

为什么使用插件机制Android插件化可以带来以下好处: 可以解决65536问题:但是在5.x以后加上mutildex这个需求变得不哪么强了 插件可以动态升级:对动态升级有需求的APP来说,这个吸引力...
  • zlping
  • zlping
  • 2017年06月29日 15:30
  • 189
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:创建插件框架(2)
举报原因:
原因补充:

(最多只允许输入30个字)