Welcome

首页 / 软件开发 / .NET编程技术 / 闲谈可插拔式应用程序的开发

闲谈可插拔式应用程序的开发2010-12-14 博客园 朱祁林很多软件都是可插拔的,最知名的便是微软的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>(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;
}
}
}
}