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; assembly = Assembly.LoadFrom(file); catch continue; types = assembly.GetTypes(); catch (Exception ex) continue; foreach (Type type in types) if (type.GetInterface(InterFaceName) != null !type.IsAbstract) object thisObject = Activator.CreateInstance(type);
}
这个流程其实很简单,我也比较方便的实现了自制的插件系统。 但问题随之而来:
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. 如何在不实例化该类的前提下获得对象的某些属性?之所以不想实例化,是因为该对象可能比较庞大,如果对象很多,这会带来显著的性能问题
有任何问题随时欢迎交流!
net netcore2 netcore3 HtmlHelper扩展(checkboxlistfor)为例 net HtmlHelper扩展(checkboxlistfor)为例 netcore2 IHtmlHelper扩展(checkboxlistfor)为例 netcore3 IHtmlHelper扩展(checkboxlistfor)为例
相关文章
- .NET Core开源Quartz.Net作业调度框架实战演练
- .NET开源Protobuf-net组件修炼手册
- XP 系统如何安装.NET Framework4.0
- ASP.NET实现一个在线音乐统计网站(歌手,音乐,角色……增删改查)
- .NET(C#) Internals: as a developer, .net framework in my eyes
- 重新整理 .net core 实践篇—————日志系统之服务与日志之间[十六]
- 机房收费系统(VB.NET)个人版总结
- 集成Swagger接口文档分组配置.net core
- 重新整理 .net core 实践篇—————配置系统之强类型配置[十]
- 《安富莱嵌入式周报》第284期:Matlab2022b发布,支持从 .NET 调用,耳机放大器,牛屎芯片替换,JSON可视化,开源的飞行软件和嵌入式系统框架
- [ASP.NET Core 3框架揭秘]服务承载系统[3]:总体设计[上篇]
- .NET Core采用的全新配置系统[3]: “Options模式”下的配置是如何绑定为Options对象
- ASP.NET Web API路由系统:路由系统的几个核心类型
- 常见掌握类库与工具体系图 艾提拉总结 Atitit 文档资料处理重要类库与工具体系树 Configuration yml xml jsoup Net apache commons net
- 2022届软件技术专业毕业生就业岗位分析(.Net方向)
- 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权
- IronXL for .NET 2022.6
- 论文阅读:U-Net++: Redesigning Skip Connections to Exploit Multiscale Features in Image Segmentation
- 【.Net实用方法总结】 整理并总结System.IO中FileInfo类及其方法介绍
- .NET深入解析LINQ框架(四:IQueryable、IQueryProvider接口详解)
- .NET都实现平台统一了你还不会WPF界面设计?
- 关于ASP.net开启身份验证时集成的托管管道模式下不适用的 ASP.NET 设置