博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于插件架构的简单的Winform框架(上)
阅读量:5291 次
发布时间:2019-06-14

本文共 2789 字,大约阅读时间需要 9 分钟。

一、概述

  在前面的文章中系统的介绍过MEF技术,我们知道通过MEF可以很容易的实现应用程序的扩展。那么除了MEF之外应该还有很多技术可以实现应用程序的扩展(毕竟MEF是随着.net4.0一起发布的)。本文就简单的介绍下其中一种扩展技术:【插件架构】,分为上、下两篇,上篇介绍基本概念,下篇为应用篇。由于插件架构在winform中应用较为广泛,因此本文的写作目的是使用插件架构搭建一个简单的winform程序。

二、插件与插件架构(或者叫“插件机制”)

1.插件

      日常,我们使用各种软件(特别是使用VS)时,可以安装很多的插件。那插件(plug-in)是什么呢?先介绍一个概念:宿主(host),顾名思义就是程序寄宿或挂载对象。有了宿主我们就可以定义插件了:符合指定宿主某种接口,并能够提供特定功能的程序。(个人观点)

2.插件架构

   一时也没有想到什么好的语句来定义插件架构,但是可以这样描述它:插件架构是这样一种的设计,它降低了宿主与具体的应用模块的依赖,对于宿主来说,它不再关心每一个具体的插件如何实现,只要该插件满足宿主的规范,那么宿主就能够加载它。 相反,作为插件,它只要满足了宿主的规范便可被宿主加载。这样设计出来的程序具有很强的扩展性。

使用插件架构时一般都会使用到反射(reflector)。

三、示例

在上面的描述中我们提到了插件需要满足宿主的某种规范。这种规范在实际编码中便体现成Interface或者abstract class。

1.我们定义一个接口如下: 

1     /// 2     /// 插件应遵循的接口3     /// 4     public interface IPlugIn5     {6         void Show();7     }

 

2.定义一个插件,需要实现上述接口:

1     ///  2     /// 具体插件 3     ///  4     public class MyPlugIn : IPlugIn 5     { 6  7  8         #region IPlugIn 成员 9 10         public void Show()11         {12             Console.WriteLine("This is my PlugIn!");13         }14 15         #endregion16     }

3.重点来了,我们这里定义一个宿主,并利用反射创建具体插件的实例:

1    public class PlugInHost 2     { 3         ///  4         /// 加载所有的插件 5         ///  6         /// 
7 public List
LoadPlugIns() 8 { 9 List
plugList = new List
();10 Assembly pluginAssembly = null;11 string path = System.IO.Directory.GetCurrentDirectory() + "/plugins/MyPlugin.dll";12 try13 {14 //加载程序集15 pluginAssembly = Assembly.LoadFile(path);16 }17 catch(Exception ex)18 {19 Console.WriteLine(ex.Message);20 return plugList;21 }22 Type[] types = pluginAssembly.GetTypes();23 foreach (Type type in types)24 {25 if (type.GetInterface("IPlugIn") != null)26 {27 //创建插件的实例28 plugList.Add((IPlugIn)Activator.CreateInstance(type));29 }30 }31 return plugList;32 33 }34 }

 

4.定义完了插件、扩展规则、宿主之后我们来尝试调用:

 

1        static void Main(string[] args) 2         { 3             PlugInHost host = new PlugInHost(); 4             var plugins =  host.LoadPlugIns(); 5             foreach (var plugin in plugins) 6             { 7                 plugin.Show(); 8             } 9 10             Console.Read();11         }12     }

 

看下运行结果:

到此我们制作了一个简单的基于插件架构的程序,我可以看一下项目结构:

在上述解决方案中,引用关系为:Host引用AppContex,MyPlugIn引用AppContex。这样就把Host和具体PlugIn隔离开了,减少了依赖,方便我们队应用程序的扩展。

      当然实际应用中的插件架构要比上面这个例子复杂很多。其中还要涉及到插件和宿主的交互,插件之间的交互。在下一篇文章中,我们将具体介绍插件架构在Winform程序中的应用,将涉及到插件同宿主、插件同插件之间的交互,

转载于:https://www.cnblogs.com/pszw/archive/2012/05/20/2510324.html

你可能感兴趣的文章
一步步学习微软InfoPath2010和SP2010--第五章节--添加逻辑和规则到表单(2)--处理验证与格式化...
查看>>
在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。...
查看>>
MVC,MVP 和 MVVM 的图示,区别
查看>>
IDEA快速实现接口快捷方式
查看>>
用默认的打开方式打开本地文件
查看>>
JavaScript-jQuery报TypeError $(...) is null错误(jQuery失效)解决办法
查看>>
C语言栈的实现
查看>>
代码为什么需要重构
查看>>
SAP销售模块塑工常见问题和解决方案(自己收藏)
查看>>
事后诸葛亮博客
查看>>
TC SRM 593 DIV1 250
查看>>
SRM 628 DIV2
查看>>
Round Numbers
查看>>
2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
查看>>
Varish 缓存
查看>>
Jbpm5.4实例在JBoss中运行、及H2数据库迁移oracle数据库
查看>>
各个平台的mysql重启命令
查看>>
统计单词,字符,和行
查看>>
蓝牙的几种应用层协议作用
查看>>
《Akka应用模式:分布式应用程序设计实践指南》读书笔记8
查看>>