我们现在已经搭建了插件式的应用程序框架,接下来的工作就是要充实框架的内容,提供基本的服务,也就是Service。我想首要的任务就是提供插件的管理服务,我在前面的文章也提到了,要实现动态加载必须要知道插件寄宿在哪里,哪些要加载,哪些不加载,这些就是这篇文章要讨论的问题。 首先解决的就是插件放在什么地方,我采取的传统的方法,将插件放到应用程序所在目录下的制定目录,我会在应用程序所在的目录下创建一个文件夹,命名为Plugins。接下来的工作就是要通知哪些插件是要加载的,哪些是不需要加载的,我会将这些信息放到应用程序的配置文件中的制定配置块中,当应用程序运行的时候,就会读取配置文件,并根据获得的信息加载插件。另外我们的应用程序框架是建立在Service基础之上,所以我需要创建一个管理插件的service。 我们现在定义一个插件管理的Service接口。
PluginService要实现的目标首先是在配置文件中添加/删除要加载的插件以及相关的信息,接下来就是动态的加载插件。我们要定义几个类型:Plugin配置区块类型,Plugin元素类型,plugin元素集合类型,以便我们能够读取插件的信息。 最后我们实现PluginService:
由于代码比较多,我也就不一一列举了,只把比较重要的代码列出来,其余的我会提供源代码的下载。在实现了PluginService以后,我们需要有一个地方能够使用这个Service来管理插件,我的做法是在一个菜单里添加一个项目,当用户点击这个项目的时候弹出插件管理的对话框,用户在这个对话框中选择使用那些插件,当插件被选中的时候,插件会被立即加载进来,并且记录到配置文件里,当用户下次运行应用程序的时候,插件默认会被自动的加载。
样子,总体来说我们就为Plugin的管理提供了一个基本的实现,如果大家还有什么不明白的地方,可以参考我提供的源代码或者通过e-mail和我联系。 源代码下载
posted on 2007-03-12 22:55 纶巾客 阅读(9572) 评论(19) 编辑 收藏
我喜欢文章 回复 引用 查看
插件式构架应用于WINFORM比较方便 对于WEBFORM不知道博主有无什么好的IDEA? 回复 引用
@wang-seraph 对于Web方面的应用,那就灵活的多了,不一定非要用插件。 回复 引用 查看
的确WEB方面很灵活 不过如果能插件化,对于一些BLOG,BBS之类的程序,可以由大家来开发各种丰富的插件不是更好么 回复 引用
@wang-seraph web的插件,做好了之后传到服务器上面么? 要是谁来个什么木马、钓鱼什么的,大家岂不是完菜了。 回复 引用 查看
没怎么看懂这个系列. 感觉楼主现在讲的内容如果结合具体的工具讲就好了. 感觉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 回复 引用
楼主好: 在下实践当中还有几处不明,忘博主能够再发一编讲解一下系统的安全性问题如何解决: 按博主这个框架,全程序都可用service方式实现,我们不希望用户开发插件时可以通过GetService来得到我们系统中核心性的服务。(比如说,随然没有告诉用户我们的其中一个service类型,但用户是可以通过反射发现我们系统中所有类型的,这样他们同样可以像我们系统中核心部分一样去使用这些服务了) 回复 引用
这个例子能不能多写点注释呀`我这个看不太懂~~谢谢博主 回复 引用
觉得这里不用哪么麻烦... 回复 引用
IPluginService pluginService = (IPluginService)application.GetService(typeof(IPluginService)); 这一段是怎么获得到PluginService 类型的我怎么也看不懂,这里面好像跟PluginService 一点关系也没有啊,我只是知道PluginService 实现了IPluginService 接口。如果有多个类型都实现了IPluginService接口,我怎么才能知道最后 pluginService 是什么类型呢?? 回复 引用
在你那下载的解决方案中 public new object GetService(Type serviceType) { return serviceContainer.GetService(serviceType); } 返回是有值的, 而我 拷贝你的 为什么返回的是null. 注释说 无法找到该服务的情况下为 null 这是什么意思? 是还要开启什么服务? 回复 引用 查看
牛X 回复 引用 查看