插件架构学习体会(一) -- 宿主程序说:插件你得听我的

简介: 看了一段时间的#develop,首先接触到的就是程序的插件架构。园子里也有许多不错的资料可以学习。随时把自己的认识写下来和大家交流,无疑会有很大帮助。闲话就不说了,进入正题。     说到插件架构,首先要有一个整体印象,到底什么才是插件架构?这个问题的答案很好找,找个插件架构的程序看看就可以了,比如VS,MyIE,再比如千千静听。
   看了一段时间的#develop,首先接触到的就是程序的插件架构。园子里也有许多不错的资料可以学习。随时把自己的认识写下来和大家交流,无疑会有很大帮助。闲话就不说了,进入正题。
     说到插件架构,首先要有一个整体印象,到底什么才是插件架构?这个问题的答案很好找,找个插件架构的程序看看就可以了,比如VSMyIE,再比如千千静听。我们可以开发不同功能的插件,加载到宿主程序上,功能就能发挥作用。宿主程序呢,完全不知道我们到底什么样的功能,怎么实现的。这里呢,我想从我们平常写程序时引用一些类库说起。我们经常会把一些功能封装到一个dll中,然后在其他项目中引用,引用时,直接调用其中的方法就ok了。Dll是编译过的,方法名是我们自己知道的,无论是自己写的dll,还是引用别人的,总之,我们一定知道我们调用的什么方法。试想一下,如果我们加一个约定,约定了这个dll中的方法名,那这个时候,这个dll的客户程序是不是不用管是什么dll,只要调用约定的方法就可以了?那再想一下,这个dll非得引用吗?动态加载行不行?当然行,加载之后,去调用约定的方法,完全可以。到这里,我们发现,其实只要一个约定,客户程序完全不需要去在意它的服务者是什么样的状态,exe也好dll也好,只要能提供契约里的方法就ok了,它只关心有没有这么一个方法可以调用。至此,发现这不就是最最简单的一个插件架构的样子吗?
   
接下来,赶紧动手写个例子试一下:
    首先,定义一个契约,这里采用了接口,那最好再来一个实现该接口的抽象类,如下
     public  interface  IPlugIn
    
{
        
//往控制台上打印东西,这里可以写任何你想要的契约行为
        void PrintToConsole();
    }

    接下来,写宿主程序,宿主程序肯定要先加载实现了IPlugIn的插件,然后调用其约定的方法。在.Net里无非就是反射一下就ok了,看代码:
  static  void  Main( string [] args)
        
{
            List
<IPlugIn> PlugIns = LoadPlugIn();
            
if (PlugIns != null)
            
{
                
foreach (IPlugIn p in PlugIns)
                
{
                    p.PrintToConsole();
                }

            }

            Console.ReadLine();      

        }

        
/// <summary>
        
/// 加载插件
        
/// </summary>
        
/// <returns>返回可用插件的列表</returns>

         private  static  List < IPlugIn >  LoadPlugIn()
        
{
            List
<IPlugIn> Plugs = new List<IPlugIn>();
            Assembly a 
= null;
            
try
            
{
               a 
= Assembly.LoadFile(Console.ReadLine());
            }

            
catch 
            
{
                Console.WriteLine(
"File not found!");
                
return null;
            }

            System.Type[] types 
= a.GetTypes();
            
foreach (System.Type type in types)
            
{
                
//校验加载的dll是否实现了契约,当然此处也可以用Attribute来实现
                if (type.GetInterface("IPlugIn"!= null)
                
{
                    Plugs.Add((IPlugIn)Activator.CreateInstance(type));
                }

            }

            
return Plugs;
        }

    }
    下一步,该完成插件了,实现那个接口而已嘛,简单
         // 实现了contract里约定的方法,控制台上输出"Hello world"字符串
         public  void  PrintToConsole()
        
{
            Console.WriteLine(
"Hello world!");
        }
    测试一下,为了方便,我把插件dll copy到G盘根目录下(可以少打几个字母哦),运行宿主程序,输入该dll路径,看到了我们预期的hello world
    
    代码地址: http://files.cnblogs.com/Pcant/SimplePlug-in.rar    (待续)
    园子里相关资源推荐:
    http://www.cnblogs.com/guanjinke/archive/2007/03/14/675109.html
    http://www.cnblogs.com/wayfarer/articles/28537.html
目录
相关文章
|
14天前
|
SQL 数据可视化 数据库
多维度解析低代码:从技术架构到插件生态
本文深入解析低代码平台,涵盖技术架构、插件生态及应用价值。通过图形化界面和模块化设计,低代码平台降低开发门槛,提升效率,支持企业快速响应市场变化。重点分析开源低代码平台的优势,如透明架构、兼容性与扩展性、可定制化开发等,探讨其在数据处理、功能模块、插件生态等方面的技术特点,以及未来发展趋势。
|
13天前
|
SQL 数据可视化 数据库
多维度解析低代码:从技术架构到插件生态
本文深入解析低代码平台,从技术架构到插件生态,探讨其在企业数字化转型中的作用。低代码平台通过图形化界面和模块化设计降低开发门槛,加速应用开发与部署,提高市场响应速度。文章重点分析开源低代码平台的优势,如透明架构、兼容性与扩展性、可定制化开发等,并详细介绍了核心技术架构、数据处理与功能模块、插件生态及数据可视化等方面,展示了低代码平台如何支持企业在数字化转型中实现更高灵活性和创新。
37 1
|
5月前
|
存储 分布式数据库 数据库
Hbase学习二:Hbase数据特点和架构特点
Hbase学习二:Hbase数据特点和架构特点
86 0
|
3月前
|
设计模式 架构师 Java
Java开发工程师转架构师需要学习什么
Java开发工程师转型为架构师需掌握多项技能:精通Java及框架、数据库与分布式系统;熟悉设计模式与架构模式;积累项目经验;提升沟通与领导力;持续学习新技术;培养系统设计与抽象能力;了解中间件及开发工具;并注重个人特质与职业发展。具体路径应结合个人目标与实际情况制定。
73 18
|
4月前
|
存储 算法 前端开发
JVM架构与主要组件:了解Java程序的运行环境
JVM的架构设计非常精妙,它确保了Java程序的跨平台性和高效执行。通过了解JVM的各个组件,我们可以更好地理解Java程序的运行机制,这对于编写高效且稳定的Java应用程序至关重要。
54 3
|
3月前
x86体系架构学习
x86体系架构学习
|
4月前
|
机器学习/深度学习 算法 网络架构
神经网络架构殊途同归?ICML 2024论文:模型不同,但学习内容相同
【8月更文挑战第3天】《神经语言模型的缩放定律》由OpenAI研究人员完成并在ICML 2024发表。研究揭示了模型性能与大小、数据集及计算资源间的幂律关系,表明增大任一资源均可预测地提升性能。此外,论文指出模型宽度与深度对性能影响较小,较大模型在更多数据上训练能更好泛化,且能高效利用计算资源。研究提供了训练策略建议,对于神经语言模型优化意义重大,但也存在局限性,需进一步探索。论文链接:[https://arxiv.org/abs/2001.08361]。
51 1
|
5月前
|
Web App开发 JavaScript 前端开发
Chrome插件实现问题之最新的 Chrome 浏览器架构有什么新的改变吗
Chrome插件实现问题之最新的 Chrome 浏览器架构有什么新的改变吗
|
5月前
|
JSON Go C++
开发与运维C++问题之在iLogtail新架构中在C++主程序中新增插件的概念如何解决
开发与运维C++问题之在iLogtail新架构中在C++主程序中新增插件的概念如何解决
49 1
|
8天前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。