插件架构学习体会(二) -- 插件程序说:要求平等对话

简介: 在上一篇中我们知道,宿主程序对插件程序定义了一个规约,以此达到和插件程序通讯的目的。那插件有些不平衡,有时候我也需要知道你宿主程序的一些信息来完成我的工作,因此,我必须和你通讯,要有对话的权利。实际上,插件一般都会或多或少的用到宿主程序的上下文,比如vs插件,需要获取vs环境中的编辑的代码对象,才能完成它的工作比如格式化啊统计啊,再比如播放器的歌词插件,至少要获取播放器正在播放的是哪首歌吧。

在上一篇中我们知道,宿主程序对插件程序定义了一个规约,以此达到和插件程序通讯的目的。那插件有些不平衡,有时候我也需要知道你宿主程序的一些信息来完成我的工作,因此,我必须和你通讯,要有对话的权利。实际上,插件一般都会或多或少的用到宿主程序的上下文,比如vs插件,需要获取vs环境中的编辑的代码对象,才能完成它的工作比如格式化啊统计啊,再比如播放器的歌词插件,至少要获取播放器正在播放的是哪首歌吧。那么我们如何来实现这个通讯呢?我们知道宿主通过一个接口来操作插件,那么同理,插件可以通过一个接口来操作宿主。首先,我们要明确宿主要提供什么属性和方法可供插件们操作,可以提取出一个接口来规约这些行为,那么这个接口就是插件获取宿主context的桥梁。只要插件持有这个接口的引用,实例化时把宿主程序的引用赋上,那么插件便有了对话的权利。稍微改一下上次的代码,如下:
加上一个宿主必须实现的契约:


1public interface IAppContext
2    {
3        //约定宿主程序有一个字符串属性
4        string TextToPrint getset; }
5    }
修改插件接口,让接口中持有对他的引用

1  public interface IPlugIn
2     {
3         IAppContext App { getset; }
4         //往控制台上打印东西,这里可以写任何你想要的契约行为
5         void PrintToConsole();
6     }
宿主程序实现IAppContext

 1     public class SimplePlugIn : IAppContext
 2     {
 3         string _TextOut = "This is a property of the main program";
 4         public string TextToPrint
 5         {
 6             get { return _TextOut; }
 7             set { _TextOut = value; }
 8         }
 9       ……
10      }
那么下一步,我们在实例化插件的时候,把宿处程序的引用赋过去,这里我把加载插件、实例化插件拉出来放到了一个具体类中,因为没法在静态方法中使用this以用当前宿主程序初始化插件中的IAppContext引用

 1 foreach (System.Type type in types)
 2             {
 3                 //校验加载的dll是否实现了契约,当然此处也可以用Attribute来实现
 4                 if (type.GetInterface("IPlugIn"!= null)
 5                 {
 6                     IPlugIn plugin = (IPlugIn)Activator.CreateInstance(type);
 7                     plugin.App = this;
 8                     Plugs.Add(plugin);
 9                 }
10             }

这样插件中就可以访问宿主程序暴露的属性了


1  //实现了contract里约定的方法,控制台上输出宿主程序的属性TextOut字符串
2         public void PrintToConsole()
3         {
4             Console.WriteLine(m_App.TextToPrint);
5         }

结果如下:

代码下载:http://files.cnblogs.com/Pcant/simplePlun-in2.rar

目录
相关文章
|
2月前
|
存储 分布式数据库 数据库
Hbase学习二:Hbase数据特点和架构特点
Hbase学习二:Hbase数据特点和架构特点
44 0
|
3月前
|
缓存 C语言 计算机视觉
程序与技术分享:CPU0处理器的架构及应用
程序与技术分享:CPU0处理器的架构及应用
|
25天前
|
存储 算法 前端开发
JVM架构与主要组件:了解Java程序的运行环境
JVM的架构设计非常精妙,它确保了Java程序的跨平台性和高效执行。通过了解JVM的各个组件,我们可以更好地理解Java程序的运行机制,这对于编写高效且稳定的Java应用程序至关重要。
33 3
|
6天前
x86体系架构学习
x86体系架构学习
|
1月前
|
机器学习/深度学习 算法 网络架构
神经网络架构殊途同归?ICML 2024论文:模型不同,但学习内容相同
【8月更文挑战第3天】《神经语言模型的缩放定律》由OpenAI研究人员完成并在ICML 2024发表。研究揭示了模型性能与大小、数据集及计算资源间的幂律关系,表明增大任一资源均可预测地提升性能。此外,论文指出模型宽度与深度对性能影响较小,较大模型在更多数据上训练能更好泛化,且能高效利用计算资源。研究提供了训练策略建议,对于神经语言模型优化意义重大,但也存在局限性,需进一步探索。论文链接:[https://arxiv.org/abs/2001.08361]。
23 1
|
2月前
|
Web App开发 JavaScript 前端开发
Chrome插件实现问题之最新的 Chrome 浏览器架构有什么新的改变吗
Chrome插件实现问题之最新的 Chrome 浏览器架构有什么新的改变吗
|
2月前
|
JSON Go C++
开发与运维C++问题之在iLogtail新架构中在C++主程序中新增插件的概念如何解决
开发与运维C++问题之在iLogtail新架构中在C++主程序中新增插件的概念如何解决
32 1
|
3月前
|
缓存 NoSQL Java
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
87 5
|
3月前
|
设计模式 前端开发 Java
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
34 1
|
3月前
|
存储 SQL 分布式计算
技术心得记录:深入学习HBase架构原理
技术心得记录:深入学习HBase架构原理

热门文章

最新文章

下一篇
DDNS