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


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

    代码下载:https://files.cnblogs.com/Pcant/SimplePlug-in3.rar
  • 相关阅读:
    python3的pygame的五子棋布局设置和代码详细分析
    RAID原理分析
    Python攻城狮教你用Pythin开机和关机,关机只需一条执行命令
    Python 之 MySql 每日一练 329——查询名字中含有风字的学生信息
    Python 之 MySql 每日一练 232——查询每门课程的平均成绩
    网络虚拟化基础协议·Geneve
    openstack octavia的实现与分析(一)openstack负载均衡的现状与发展以及lvs,Nginx,Haproxy三种负载均衡机制的基本架构和对比
    Linux下多网卡绑定bond及模式介绍
    Python调试器-pdb的使用
    ubuntu server安装的一些坑
  • 原文地址:https://www.cnblogs.com/lzhdim/p/1368803.html
Copyright © 2020-2023  润新知