插件架构学习体会(三)--插件:兄弟们要团结

简介: 插件和宿主程序之间的相互通讯都不是什么问题了,那插件之间的相互通讯呢?理论上来说,插件之间的相互通讯是比较少见的,因为他们之间的通讯势必造成插件之间的依赖关系,那么对加载顺序也就有了严格的要求,我们应该尽量避免这种依赖。
插件和宿主程序之间的相互通讯都不是什么问题了,那插件之间的相互通讯呢?理论上来说,插件之间的相互通讯是比较少见的,因为他们之间的通讯势必造成插件之间的依赖关系,那么对加载顺序也就有了严格的要求,我们应该尽量避免这种依赖。话说回来,如果需要插件间通讯,我们该如何做,不难想到,既然插件和宿主可以相互通讯,那我们只要让宿主做插件的中间人,就可以把两个插件联系在一起,毕竟宿主可以持有插件的引用。按照这个思路,继续修改程序:
    首先我们得让宿主程序保存已加载插件的引用,并能获取制定的插件引用,修改一下IAppContext接口,添加以下内容

 //宿主程序需要保存所有插件的信息,以插件可以相互获得其他插件的引用
        void AddService(string pluginName, IPlugIn plugin);
        
void RemoveService(string pluginName);
        IPlugIn GetService(
string pluginName);
    接下来要在宿主中实现这些接口了

        //用来保存插件引用的列表
        private Dictionary<string,IPlugIn> _Services = new  Dictionary<string,IPlugIn>();
        
public void AddService(string pluginName, IPlugIn plugin)
        {
            
this._Services.Add(pluginName,plugin);
        }
        
public void RemoveService(string pluginName)
        {
            
this._Services.Remove(pluginName);
        }
        
public IPlugIn GetService(string pluginName)
        {
            IPlugIn plugin
= null;
            
if(this._Services.TryGetValue(pluginName,out plugin))
                
return plugin;
            
else 
                
return null;
        }
    这样在load插件的时候,把插件的引用保存起来AddService(plugin.ToString(), plugin),新建一个插件,在新插件中可以通过宿主的GetService()方法获取指定插件的引用,代码如下

        //实现了contract里约定的方法,控制台上输出宿主程序的属性TextOut字符串
        public void PrintToConsole()
        {
            IPlugIn plugin 
= m_App.GetService("ASimplePlugIn.PrintHelloWorld");
            
if(plugin==null)
                Console.WriteLine(
"please load plugin named ASimplePlugIn first");
            
else
                plugin.PrintToConsole();
        }
    结果如下:

代码下载: http://files.cnblogs.com/Pcant/SimplePlug-in3.rar
目录
相关文章
|
3月前
|
存储 关系型数据库 数据库
个人学习ack-eci架构
针对无状态应用进行容器化改造,同时有应对高峰业务以及定时、批量计算任务对容器集群节点计算资源有高弹性低成本优化的需求的用户,利用云上资源的灵活性和规模化优势,构建云上高弹性、稳定、成本优化的服务。
34 0
|
1月前
|
消息中间件 缓存 Java
SpringBoot的架构学习之路
SpringBoot的架构学习之路
|
1月前
|
Web App开发 JavaScript 前端开发
分析网站架构:浏览器插件
分析网站架构:浏览器插件
44 1
|
2月前
|
网络协议 Java 容器
学习阿里云架构设计知识
学习阿里云架构设计知识
199 0
|
2月前
|
Java 调度 开发工具
SpringCloud【微服务架构进化论、微服务的拆分规范和原则、为什么选择Spring Cloud、什么是服务治理 】(一)-全面详解(学习总结---从入门到深化)
SpringCloud【微服务架构进化论、微服务的拆分规范和原则、为什么选择Spring Cloud、什么是服务治理 】(一)-全面详解(学习总结---从入门到深化)
184 0
|
2月前
|
网络协议 中间件 数据库
Zookeeper学习系列【三】Zookeeper 集群架构、读写机制以及一致性原理(ZAB协议)
Zookeeper学习系列【三】Zookeeper 集群架构、读写机制以及一致性原理(ZAB协议)
95 0
|
3月前
|
人工智能 前端开发 JavaScript
【利用AI让知识体系化】前端开发学习&了解业务架构(二)
【利用AI让知识体系化】前端开发学习&了解业务架构
|
3月前
|
人工智能 前端开发 JavaScript
【利用AI让知识体系化】前端开发学习&了解业务架构(一)
【利用AI让知识体系化】前端开发学习&了解业务架构
|
3月前
|
SQL 关系型数据库 MySQL
分布式事物【XA强一致性分布式事务实战、分布式架构的理论知识、TCC核心组成】(六)-全面详解(学习总结---从入门到深化)
分布式事物【XA强一致性分布式事务实战、分布式架构的理论知识、TCC核心组成】(六)-全面详解(学习总结---从入门到深化)
32 0