天天看点

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

  看了一段时间的#develop,首先接触到的就是程序的插件架构。园子里也有许多不错的资料可以学习。随时把自己的认识写下来和大家交流,无疑会有很大帮助。闲话就不说了,进入正题。

     说到插件架构,首先要有一个整体印象,到底什么才是插件架构?这个问题的答案很好找,找个插件架构的程序看看就可以了,比如VS,MyIE,再比如千千静听。我们可以开发不同功能的插件,加载到宿主程序上,功能就能发挥作用。宿主程序呢,完全不知道我们到底什么样的功能,怎么实现的。这里呢,我想从我们平常写程序时引用一些类库说起。我们经常会把一些功能封装到一个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

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

    园子里相关资源推荐:

继续阅读