随笔 - 44  文章 - 0 评论 - 348 trackbacks - 116
<2009年2月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567

本博客上的所有文章如非特别说明均为原创,如果要转载请注明文章出处。

搜索

 
 

常用链接

我参与的团队

随笔分类(40)

随笔档案(44)

文章分类

联系我

友情链接

积分与排名

  • 积分 - 226417
  • 排名 - 256

最新评论

阅读排行榜

评论排行榜

      我们现在已经搭建了插件式的应用程序框架,接下来的工作就是要充实框架的内容,提供基本的服务,也就是Service。我想首要的任务就是提供插件的管理服务,我在前面的文章也提到了,要实现动态加载必须要知道插件寄宿在哪里,哪些要加载,哪些不加载,这些就是这篇文章要讨论的问题。
       首先解决的就是插件放在什么地方,我采取的传统的方法,将插件放到应用程序所在目录下的制定目录,我会在应用程序所在的目录下创建一个文件夹,命名为Plugins。接下来的工作就是要通知哪些插件是要加载的,哪些是不需要加载的,我会将这些信息放到应用程序的配置文件中的制定配置块中,当应用程序运行的时候,就会读取配置文件,并根据获得的信息加载插件。另外我们的应用程序框架是建立在Service基础之上,所以我需要创建一个管理插件的service
       我们现在定义一个插件管理的Service接口。        

using System;
using System.Collections.Generic;
using System.Text;

namespace PluginFramework
{
    
public interface IPluginService
    
{
        IApplication Application 
get;set;}
        
void AddPlugin(String pluginName, String pluginType, String Assembly, String pluginDescription);
        
void RemovePlugin(String pluginName);
        String[] GetAllPluginNames();
        Boolean Contains(String pluginName);
        Boolean LoadPlugin(String pluginName);
        Boolean UnLoadPlugin(String pluginName);
        IPlugin GetPluginInstance(String pluginName);
        
void LoadAllPlugin();
    }

}

      PluginService要实现的目标首先是在配置文件中添加/删除要加载的插件以及相关的信息,接下来就是动态的加载插件。我们要定义几个类型:Plugin配置区块类型,Plugin元素类型,plugin元素集合类型,以便我们能够读取插件的信息。
       最后我们实现PluginService:

      
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Configuration;
using System.Reflection;
using System.Windows.Forms;
using System.IO;
using System.Collections;

namespace PluginFramework
{
    
public class PluginService : IPluginService
    
{
        
private IApplication application = null;
        
private PluginConfigurationSection config = null;
        
private Dictionary<String, IPlugin> plugins = new Dictionary<string, IPlugin>();
        
private XmlDocument doc = new XmlDocument();

        
public PluginService()
        
{

        }


        
public PluginService(IApplication application)
        
{
            
this.application = application;

        }


        
IPluginService Members
    }

}

      

    由于代码比较多,我也就不一一列举了,只把比较重要的代码列出来,其余的我会提供源代码的下载。在实现了PluginService以后,我们需要有一个地方能够使用这个Service来管理插件,我的做法是在一个菜单里添加一个项目,当用户点击这个项目的时候弹出插件管理的对话框,用户在这个对话框中选择使用那些插件,当插件被选中的时候,插件会被立即加载进来,并且记录到配置文件里,当用户下次运行应用程序的时候,插件默认会被自动的加载。

       另外从现在开始我们就需要使用配置文件了,所以,我们需要给应用程序添加一个app.config文件,文件内容如下:
      
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  
<configSections>
    
<section
      
name="PluginSection"
      type
="PluginFramework.PluginConfigurationSection, PluginFramework"
      
/>    
  
</configSections> 
  
<PluginSection>
    
  
</PluginSection>
</configuration>

      样子,总体来说我们就为Plugin的管理提供了一个基本的实现,如果大家还有什么不明白的地方,可以参考我提供的源代码或者通过e-mail和我联系。
      源代码下载

0
0
(请您对文章做出评价)
« 上一篇:构建插件式的应用程序框架(四)----服务容器
» 下一篇:WinForm控件开发总结目录
posted on 2007-03-12 22:55 纶巾客 阅读(7215) 评论(17)  编辑 收藏 所属分类: .Net Framework

FeedBack:
#1楼 2007-03-12 23:07 JesseZhao      
我喜欢文章
  回复  引用  查看    
插件式构架应用于WINFORM比较方便
对于WEBFORM不知道博主有无什么好的IDEA?

  回复  引用    
#3楼[楼主] 2007-03-13 08:49 纶巾客      
@wang-seraph
对于Web方面的应用,那就灵活的多了,不一定非要用插件。

  回复  引用  查看    
的确WEB方面很灵活
不过如果能插件化,对于一些BLOG,BBS之类的程序,可以由大家来开发各种丰富的插件不是更好么

  回复  引用    
#5楼 2007-03-13 10:21 妖居      
@wang-seraph
web的插件,做好了之后传到服务器上面么?
要是谁来个什么木马、钓鱼什么的,大家岂不是完菜了。

  回复  引用  查看    
#6楼 2007-03-13 10:24 lyb      
没怎么看懂这个系列.

感觉楼主现在讲的内容如果结合具体的工具讲就好了.
感觉Castle就是在做这些工作,楼主是吗?

  回复  引用  查看    
@妖居
web的插件,做好了之后传到服务器上面么?
要是谁来个什么木马、钓鱼什么的,大家岂不是完菜了。

WEB程序发布后大家可以根据自己的需要来编写插件自己应用
自己大概不会传木马钓鱼什么的到自己的服务器上吧

如果觉得自己的插件功能不错可以提交到发布WEB程序的官方站审核通过后加入到官方版本里供大家使用
DISCUZ不就是这样搞的么

只不过基于.net 的我还没见识到(见识短浅,望指点:))

  回复  引用    
插件之间是如何通信的,楼主赶快讲解一下,我正在做这个项目,需要解决插件架构方面的问题
  回复  引用    
博主把插件之间的通信讲讲,还有插件和主框架的交互已经插件之间的交互,
sharpdevelop所用的插件机制好像又有点不一样,看书没有看的太明白

  回复  引用    
楼主好:
private Dictionary<String, IPlugin> plugins = new Dictionary<string, IPlugin>(); //这是干什么用的?
你在源码里写到:MenuService里:
private Dictionary<String, ToolStripMenuItem> menuItems = new Dictionary<string, ToolStripMenuItem>();
ToolStripService里:
private Dictionary<String, ToolStrip> toolStrips = new Dictionary<string, ToolStrip>();
而在DockBarService里:private Dictionary<String, DockContent> dockBars = new Dictionary<string, DockContent>();
而我想改为一个普通的窗口,不是DockBar,请问接口和服务类应该怎么写?
多谢!
David.Dong

  回复  引用    
#11楼 2007-06-09 09:49 carylua[未注册用户]
楼主好:
在下实践当中还有几处不明,忘博主能够再发一编讲解一下系统的安全性问题如何解决:
 按博主这个框架,全程序都可用service方式实现,我们不希望用户开发插件时可以通过GetService来得到我们系统中核心性的服务。(比如说,随然没有告诉用户我们的其中一个service类型,但用户是可以通过反射发现我们系统中所有类型的,这样他们同样可以像我们系统中核心部分一样去使用这些服务了)

  回复  引用    
#12楼 2007-07-27 13:32 lw[未注册用户]
这个例子能不能多写点注释呀`我这个看不太懂~~谢谢博主
  回复  引用    
#13楼 2007-09-03 00:14 Saiman[未注册用户]
觉得这里不用哪么麻烦...
  回复  引用    
#14楼 2009-02-19 11:37 rime han
IPluginService pluginService = (IPluginService)application.GetService(typeof(IPluginService));

这一段是怎么获得到PluginService 类型的我怎么也看不懂,这里面好像跟PluginService 一点关系也没有啊,我只是知道PluginService 实现了IPluginService 接口。如果有多个类型都实现了IPluginService接口,我怎么才能知道最后 pluginService 是什么类型呢??

  回复  引用