发表自话题:闲淡抄人
很多软件都是可插拔的,最知名的便是微软的Windows操作系统。你可以在Windows操作系统上安装QQ,也可卸掉QQ,这便是可插拔。这里不谈Windows的实现,因为太过复杂。本文就谈谈管理软件的可插拔的实现。相对Windows操作系统,QQ就是它的一个插件。所以可以简单的将开发可插拔的软件分为两个部分。一个是主应用程序的开发,一个是插件的开发。
比Windows小的,常见的可插拔的软件是MSN。MSN主应用程序由MS开发,还存在一些MSN插件开发商,国内好像也有不少,这些插件开发商通过在插件中植入广告获取利润。MS不可能提高源代码给这些开发商,那么MSN的主应用程序和MSN的插件是如何衔接起来的呢。我想应该是MS提供了一些接口和方法供开发商使用,估计有个api之类的东西,所以开发可插拔的应用系统分为三个部分。
1、主应用程序的开发
2、公用接口的开发
3、插件的开发
了解了这些以后,下面通过一个实例来说明。这个实例的原则是可扩展性强,能向下兼用。
业务需求是:老系统每当逢年过节的时候,会通过邮件给用户发送一些祝福的邮件。现在流行手机和MSN(QQ没有借口)之后,客户希望系统能通过手机短信和MSN的消息给用户送去祝福。现在我们需要开发手机短信和MSN留言两个插件,然后将它们安装到系统中去。
实现:
为了简单起见,这里使用控制台应用程序,如果你有兴趣,可以修改成asp.net或者Windows Form的。
定义两个接口:
public interface IPluginHost { void AddMenuItem(string name, MenuItemClickedHandler clickHandler); void RegisterComponent(T component) where T : class; void MailNotice(string messaage); } public delegate void MenuItemClickedHandler(string name);这个接口是主应用程序继承的,现在只有MailNotice功能, AddMenuItem是供插件调用的方法,创建一个菜单。RegisterComponent是插件向主应用程序提供一些方法。 public interface IPlugin { void Initialize(IPluginHost pluginHost); void DoSomething(); }
上面是插件的接口。
在主应用程序中有一个加载插件的地方。这里的插件是dll,所以我通过反射去加载这些dll。
public void LoadPlugin() { foreach (string fileName in Directory.GetFiles(Directory.GetCurrentDirectory() + "\\" + "Plugins", "*.dll")) { Assembly assembly = Assembly.LoadFile(fileName); foreach (Type pluginType in assembly.GetTypes()) { if (!pluginType.IsPublic || pluginType.IsAbstract || pluginType.IsInterface) continue; Type concreteType = pluginType.GetInterface(typeof(IPlugin).FullName, true); if (concreteType != null) { IPlugin plugin = (IPlugin)Activator.CreateInstance(pluginType); plugin.Initialize(this); pluginList.Add(plugin); break; } } } }主应用程序执行的代码如下:
void Start() { //邮件发送祝福 MailNotice("中秋快乐"); //加载插件 LoadPlugin(); //运行插件 if (pluginList.Count > 0) { foreach (IPlugin plugin in pluginList) { plugin.DoSomething(); } } Console.ReadLine(); }运行结果如下:
开发两个插件,都继承IPlugin。
手机短信通知插件:
public class PluginA : IPlugin { public void Initialize(IPluginHost pluginHost) { IPluginHost myApplication = (IPluginHost)pluginHost; myApplication.AddMenuItem("Click me", OnClick); } private void OnClick(string name) { Console.WriteLine("Omg! You clicked me!"); } public void DoSomething() { Console.WriteLine("手机短信通知:中秋快乐"); } }
MSN通知插件:
public class PluginB : IPlugin { public void Initialize(IPluginHost pluginHost) { IPluginHost myApplication = (IPluginHost)pluginHost; myApplication.AddMenuItem("Click me", OnClick); } private void OnClick(string name) { Console.WriteLine("Omg! You clicked me!"); } public void DoSomething() { Console.WriteLine("MSN信息通知:中秋快乐"); } }
插件的目录如下图:
运行效果:
扩展性和兼容性:
如果我想在主应用程序中添加一个ShowMessageBox方法。而且这个方法供插件调用。考虑到版本的兼容性,公开的接口是不能修改的。比如:将主应用程序的接口修改成:
public interface IPluginHost { void AddMenuItem(string name, MenuItemClickedHandler clickHandler); void RegisterComponent(T component) where T : class; T GetComponent() where T : class; void MailNotice(string messaage); void ShowMessageBox(string message); }那么如何实现呢,很简单,使用依赖注入的方式。添加下面接口:
public interface IMessageBoxHost { void ShowMessageBox(string message); }
通过主应用程序的构造函数,将MessageBoxHost对下岗注入到主应用程序,在通过插件的构造函数,将其注入插件之中。
主应用程序的构造函数:
public Program(IMessageBoxHost messageBoxHostInstance) { this.messageBoxHostInstance = messageBoxHostInstance; }
插件构造函数:
public PluginA(IMessageBoxHost messageBoxHost) { this.messageBoxHost = messageBoxHost; }
修改实例化插件的代码:
IPlugin plugin = (IPlugin)Activator.CreateInstance(pluginType, new object[] { messageBoxHostInstance });这样我们对版本兼容有了保障。
总结:本文闲谈了可插拔应用程序的开发原理,文章的后面提供了插件和应用程序之间版本兼容的一种方案。有讨论才有进步,欢迎各位留言。
参考代码:http://files.cnblogs.com/zhuqil/Plugin.rar
参考:
A Flexible Plugin System
A more extensible way to build plugin system
(全文完)
以下为广告部分
您部署的HTTPS网站安全吗?
如果您想看下您的网站HTTPS部署的是否安全,花1分钟时间来 myssl.com 检测以下吧。让您的HTTPS网站变得更安全!
SSL检测评估
快速了解HTTPS网站安全情况。
安全评级(A+、A、A-...)、行业合规检测、证书信息查看、证书链信息以及补完、服务器套件信息、证书兼容性检测等。
SSL证书工具
安装部署SSL证书变得更方便。
SSL证书内容查看、SSL证书格式转换、CSR在线生成、SSL私钥加解密、CAA检测等。
SSL漏洞检测
让服务器远离SSL证书漏洞侵扰
TLS ROBOT漏洞检测、心血漏洞检测、FREAK Attack漏洞检测、SSL Poodle漏洞检测、CCS注入漏洞检测。
上一篇:闲谈《清明上河图》
下一篇:我亲身经历的三次 996_工作
相关阅读
相同话题文章
热门阅读
推荐内容
- 华为在HDC2021发布全新HMS Core 6 宣布跨OS能力开放
- 华为鸿蒙系统用户超1.5亿,对比谷歌苹果,差距依旧很大
- 为鸿蒙系统持续赋能!HDC2021开发者大会召开在即
- 对话华为鸿蒙掌舵人王成录:真正的第一,是掌握在自己手里的第一
- 鸿蒙系统8月9日登场,华为自研鸿蒙系统将于8月9日正式登场,还有全新的鸿鹄芯片...
- 鸿蒙 自研内核 core b,华为平板将首次搭载鸿蒙OS 2.0系统:首次自研内核与构架...
- 重磅官宣!华为将为鸿蒙系统打造编程语言:追上苹果谷歌
- 来了,就在今天,它来了! 华为海陆空通吃的中国自主研发系统:鸿蒙OS
- 重磅官宣!华为将为鸿蒙系统打造编程语言:追上苹果谷歌
- 华为开发者大会今日举行 HarmonyOS 3开发者预览版到来