NET插件系统之一,开头:MEF的一些疑问和相关思考

简介:

实现可扩展的软件系统是我一直的目标和想法。可扩展性显然属于动态编程的范畴。因此,几个月来我在业余时间会抽空学习插件系统。  

我参考了博客园的几篇插件式系统的文章。知道了实现插件系统有以下的核心流程:

      1. 定义插件接口,并在各个功能组件中实现这些接口

  2. 在主程序中,通过遍历所需目录下的dll文件,查询实现该接口的type,从而通过createInstance方法实现其动态创建,并加入到主程序插件列表。下面的代码展示了该功能。

复制代码
    public void GetAllPluginInPath(string Path, string InterFaceName)
{
string[] DllFileName = Directory.GetFileSystemEntries(Path);
Type[] types;
foreach (string file in DllFileName)
{

if (System.IO.Path.GetExtension(file) == ".dll")
{
Assembly assembly;

try
{
assembly = Assembly.LoadFrom(file);
}
catch
{
continue;
}

try
{
types = assembly.GetTypes();
}
catch (Exception ex)
{
continue;
}

foreach (Type type in types)
{
if (type.GetInterface(InterFaceName) != null && !type.IsAbstract)
{
object thisObject = Activator.CreateInstance(type);


IXPlugin rc1 = thisObject as IXPlugin;


//如果要在启动时被加载
if (rc1 != null && rc1.isStartLoaded)

{
AddPlugin(rc1);
}


}
}
}
}

}
复制代码

 

      这个流程其实很简单,我也比较方便的实现了自制的插件系统。 但问题随之而来:

      1. 如果该系统是一棵插件树,那么显然我需要不止一次查询所有dll文件,并查询所有type,这会带来显著的性能问题。

      2. 如果某类型不需要在启动时就实例化,那么我可以存储该类型,在需要的时候实现调用。

    3. 最核心也是最大的问题: 插件之间的相互访问如何解决,当前我只能采用 从插件列表中找到该引用,然后将其强制类型转换到所需的插件样式。但显然,这种做法很不好,不符合插件隔离,而且必须添加该项目引用。

      4. 我希望能在不实例化该类的前提下获得对象的某些属性, 比如, 一个游戏列表,它会提供这些游戏的名称,图片和相关信息。但这些数据才能如何获得?虽然有attribute,但它所提供的功能显然有限。

 

      后期,我采用了微软官方的MEF插件框架,我看了金旭亮老师的相关著作,并仔细阅读了Bēniaǒ成长笔记 关于MEF编程的部分,并手动实现之,虽然觉得足够方便,但带来的问题也更多:

      1. MEF可以方便的实现插件组件,不需要手动硬编码,但其中的控制权限显然不在用户,有些选项虽然开放,但你很难控制。虽然我知道有Lazy泛型,但如哪些方法在什么时候实例化还是很难保证。我并不需要在任何时候都保留所有插件的实例对象,而希望在需要的时候实例化或销毁它,可惜MEF未能提供。 

      2. 使用MEF后,必须强制将实现插件的各个组件版本升到.net 4.0, 虽然不是太难的事情,但却需要客户端更多的部署。

  3. MEF依旧没有解决插件间通信的问题,它仅仅为你提供了插件的集合,但组件间的事件,通信方法却只字未提。 如果是这样的话,它的功能岂不是太简单?

      4.MEF是否有性能问题?它的实现机制显然是反射和attribute, 但搜索目录和某一程序集并实例化的性能如何呢?我没有做过详细对比....

       结合前面,使用import和export关键字实现的MEF插件虽然很high,但带来的问题也绝对不少。   但实际上,我们手动实现一个比MEF更灵活的系统也不是一件太难的事情,而增加的代码量实际并不多,也不用加入这个依赖库。 于是,MEF的价值又有多大呢?

      

       我非常崇拜VS或者eclipse这样大型软件所实现的插件系统,主核心完全无法知道将来会有什么功能加入,但其可扩展性,性能,结构清晰程度都是像我这样的菜鸟无法企及的。是不是有更复杂的机制,如 事件管道来实现这些功能呢?我不知道。

       当然有很多类型的插件系统,比如MAF,我未曾做深入研究,是因为实在学习成本高昂,时间有限,但实际上特别希望能学习这些插件系统的精髓之处。

       非常希望有大牛能解决我的以下问题。

       1.  各插件之间能够解除引用依赖的事件通知方法。 调用难道我要把所有的功能都写入接口么?这显然不现实。

       2. 如何提升插件搜索组件的速度和性能?

       3. 如何在不实例化该类的前提下获得对象的某些属性?之所以不想实例化,是因为该对象可能比较庞大,如果对象很多,这会带来显著的性能问题

       有任何问题随时欢迎交流!

       

      


作者:热情的沙漠
出处:http://www.cnblogs.com/buptzym/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


 本文转自FerventDesert博客园博客,原文链接:http://www.cnblogs.com/buptzym/archive/2011/12/09/2282746.html,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
消息中间件 前端开发 小程序
一个基于.NET Core构建的简单、跨平台、模块化的商城系统
今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费(MIT License)的商城系统:Module Shop。
|
1月前
|
小程序 C# 数据库
3个.NET开源、免费、强大的商城系统
今天大姚给大家分享3个.NET开源、免费、强大的商城系统,希望可以帮助到有商城系统开发需求的同学。
|
3月前
|
开发框架 Oracle 关系型数据库
ASP.NET实验室LIS系统源码 Oracle数据库
LIS是HIS的一个组成部分,通过与HIS的无缝连接可以共享HIS中的信息资源,使检验科能与门诊部、住院部、财务科和临床科室等全院各部门之间协同工作。 
41 4
|
4月前
|
XML 开发框架 .NET
ASP.NET COR3.1 集成日志插件NLog
ASP.NET COR3.1 集成日志插件NLog
36 0
|
15天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
21 0
|
25天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
22 0
|
3月前
|
SQL 开发框架 .NET
ASP.NET WEB+EntityFramework数据持久化——考核练习库——1、用户管理系统(考点:查询列表、增加、删除)
ASP.NET WEB+EntityFramework数据持久化——考核练习库——1、用户管理系统(考点:查询列表、增加、删除)
72 0
|
4月前
|
前端开发 JavaScript 关系型数据库
.NET开源、强大的Web报表统计系统
.NET开源、强大的Web报表统计系统
|
5月前
|
Web App开发 开发框架 .NET
asp.net基于WEB层面的云LIS系统平台源码
结合当今各检验科管理及实验室规模的不同状况,充分吸收当今IT科技的最新成就,开发出以高度产品化、功能强大、极易实施操作、并不断升级换代为主要特点的LIS系统。彻底解决检验科的信息孤岛,全面实现全院信息互通互联、高度共享,并为检验科的规范化管理提供了有力工具。
41 0
|
5月前
|
Oracle 关系型数据库 数据管理
.NET医院检验系统LIS源码,使用了oracle数据库,保证数据的隔离和安全性
LIS系统实现了实验室人力资源管理、标本管理、日常事务管理、网络管理、检验数据管理(采集、传输、处理、输出、发布)、报表管理过程的自动化,使实验室的操作人员和管理者从繁杂的手工劳作中解放出来,提高了检验人员的工作效率和效益,降低了劳动成本和差错发生率。

相关课程

更多