iTimothy

Dynamic Plugins Manager (一) 介绍

Dynamic Plugins Manager是一个基于.NET的动态插件管理组件,也是我在业余时间做的一个小东东,代码在07年底就开始动工,因为一直没充裕时间完成,趁这个周末休息,加班加点的Coding,出来了一个原型,估计里面还有很多的显而易见的以及隐而未现的bug。 设计这个组件的初衷,是为了能方便的应用于今后的项目中。先进的企业级项目中,变化最为突出的,还是业务,业务的变化,直接导致编码中业务逻辑代码的变化。如果将这些业务逻辑混杂在一起,业务的变化,最终会导致代码的混乱,甚至难以维护。这对于一个长期迭代的项目来说,是相当痛苦的事。就像直接拿一个成千上万行的代码给开发人员,估计开发人员不是晕厥,就是吐血。而一个难以维护的业务逻辑代码,对于每一次迭代,都是一次冒险。很可能在某次的迭代中,会对以前的业务逻辑,产生影响或者风险。 对于复杂的业务逻辑,需要进行重构,并且将不断变化的业务逻辑,抽离出来。比较折中的方法,就是将这些变化的逻辑,做成独立的插件形式。这样一来,独立的业务,在物理上进行了分离。开发人员也不用担心修改某处业务逻辑,会影响其他的业务模块。而动态的插件管理形式,对后期维护也带来益处,独立的业务逻辑插件之间,不会相互影响。开发人员还可以在程序运行而又不影响业务的情况下,动态的发布、替换原有的业务逻辑模块。 Dynamic Plugins Manager(以下简称Plugins Manager),也就是按照这样的思路和需求来设计的,其实现的功能,具体有一下几个特点: 1.所有的插件,都以DLL程序集的方式发布,Plugins Manager在启动的时候,搜索加载所有可加载的插件并进行加载 2.Plugins Manager,支持插件的动态卸载功能。借助于AppDomain的特性,所有的组件,在动态加载后,可以动态从内存中卸载。插件的实现,需要继承自MarshalByRefObject。 3.与接口无依赖性,Plugins Manager负责插件的管理、动态加载、动态卸载、调用。但是和具体的插件接口无关,这样一来,开发人员可以定义自己的插件接口,并开发不同的插件实现接口。 4.插件可以动态发布和卸载,Plugins Manager会监视当前目录中,插件的变化,对于以xcopy方式,拷贝入插件目录的插件,可以进行动态加载。对于插件的卸载,可以Plugins Manager提供的接口进行动态卸载,也可以实时更改插件配置文件中的具体开关进行卸载。 5.动态编译功能:Plugins Manager允许直接发布插件代码。通过读取插件配置文件中的引用信息,可以直接从代码生成dll插件,并加载。 6.允许插件实现不同的构造函数重载,并将构造函数参数以及值信息,定义在插件配置文件中。Plugins Manager在加载插件的时候,采用配置文件中的值,调用相应的构造函数,并加载插件。 7.事件通知:Plugins Manager在不同的插件操作完成后,会触发相应的事件机制,通知客户端程序进行相应的处理

插件的结构一览:

PluginsManager:插件管理类,实现插件功能的主要代码逻辑,以及对插件容器的维护 AssemblyLoader:插件加载类,实现从AppDomain加载插件的逻辑 PluginEntity:插件实体类,包含插件的信息(插件实例、插件名称……) AssemblyFactory:插件生成类,实现从插件代码生成dll的功能

下一篇日志中,将会介绍这个插件的具体配置,及简单分析其实现。

支持原创技术分享,据说打赏我的人,都找到了女朋友!