C#实现插件式架构的方法

  插件式架构,一种全新的、开放性的、高扩展性的架构体系.插件式架构设计近年来非常流行,基于插件的设计好处很多,把扩展功能从框架中剥离出来,降低了框架的复杂度,让框架更容易实现。扩展功能与框架以一种很松的方式耦合,两者在保持接口不变的情况下,可以独立变化和发布。基于插件设计并不神秘,相反它比起一团泥的设计更简单,更容易理解。下面已C# .Net简要介绍一下插件式架构的方法.

  定义插件接口,将其编译成dll

namespace PluginInterface
{
      public interface IPlugin
      {
             string Show();
      }
}

编写插件,引用上面的DLL,实现上面定义的接口,也编译为DLL

//插件A
namespace PluginA
{
    public class PluginA:IPlugin
    {
        public string Show()
        {
            return "插件A";
        }
    }
}

//插件B
namespace PluginB
{
    public class PluginB : IPlugin
    {
        public string Show()
        {
            return "插件B";
        }
    }
}

  新建一个控制台程序,需要引用定义插件接口的dll,生成之后,需要在exe所在的目录里建一个Plugins子文件夹,将上面生成的PluginA.dll,和PluginB.dll拷贝进去。

namespace ConsolePluginTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            List<string> pluginpath =  p.FindPlugin();

            pluginpath = p.DeleteInvalidPlungin(pluginpath);

            foreach (string filename in pluginpath)
            {
                try
                {
                    //获取文件名
                    string asmfile = filename;
                    string asmname = Path.GetFileNameWithoutExtension(asmfile);
                    if (asmname != string.Empty)
                    {
                        // 利用反射,构造DLL文件的实例
                        Assembly asm = Assembly.LoadFile(asmfile);
                        //利用反射,从程序集(DLL)中,提取类,并把此类实例化
                        Type[] t = asm.GetExportedTypes();
                        foreach (Type type in t)
                        {
                            if (type.GetInterface("IPlugin") != null)
                            {
                                IPlugin show = (IPlugin)Activator.CreateInstance(type);
                                Console.Write(show.Show());
                            }
                        }
                    }
                }
                catch(Exception ex)
                {
                    Console.Write(ex.Message);
                }
            }
        }

        //查找所有插件的路径
        private List<string> FindPlugin()
        {
            List<string> pluginpath = new List<string>();
            try
            {
                //获取程序的基目录
                string path = AppDomain.CurrentDomain.BaseDirectory;
                //合并路径,指向插件所在目录。
                path = Path.Combine(path,"Plugins");
                foreach (string filename in Directory.GetFiles(path, "*.dll"))
                {
                    pluginpath.Add(filename);
                }
            }
            catch(Exception ex)
            {
                Console.Write(ex.Message);
            }
            return pluginpath;
        }
        //载入插件,在Assembly中查找类型
        private object LoadObject(Assembly asm, string className, string interfacename
                        , object[] param)
        {
            try
            {
                //取得className的类型
                Type t =asm.GetType(className);
                if (t == null
                    || !t.IsClass
                    || !t.IsPublic
                    || t.IsAbstract
                    || t.GetInterface(interfacename) == null
                   )
                {
                    return null;
                }
                //创建对象
                Object o = Activator.CreateInstance(t,param);
                if (o == null)
                {
                    //创建失败,返回null
                    return null;
                }
                return o;
            }
            catch
            {
                return null;
            }
        }
        //移除无效的的插件,返回正确的插件路径列表,Invalid:无效的
        private List<string> DeleteInvalidPlungin(List<string> PlunginPath)
        {
            string interfacename = typeof(IPlugin).FullName;
            List<string> rightPluginPath = new List<string>();
            //遍历所有插件。
            foreach (string filename in PlunginPath)
            {
                try
                {
                    Assembly asm = Assembly.LoadFile(filename);
                    //遍历导出插件的类。
                    foreach (Type t in asm.GetExportedTypes())
                    {
                        //查找指定接口
                        Object plugin = LoadObject(asm,t.FullName,interfacename,null);
                        //如果找到,将插件路径添加到rightPluginPath列表里,并结束循环。
                        if (plugin != null)
                        {
                            rightPluginPath.Add(filename);
                            break;
                        }
                    }
                }
                catch
                {
                    throw new Exception(filename+"不是有效插件");
                }
            }
            return rightPluginPath;
        }
    }
}
时间: 2024-10-11 22:02:18

C#实现插件式架构的方法的相关文章

Android应用插件式开发解决方法

Android应用插件式开发解决方法 一.现实需求描述 一般的,一个Android应用在开发到了一定阶段以后,功能模块将会越来越多,APK安装包也越来越大,用户在使用过程中也没有办法选择性的加载自己需要的功能模块.此时可能就需要考虑如何分拆整个应用了. 二.解决方案提出 一般有两种方式,一种是将应用按照功能分拆成多个应用,用户需要哪个就下载哪个,都需要就都下载.应用之间,可以在代码层面做一定的关联,以共享部分信息.另一种方式,类似于其他平台插件的方式,用户可以在主应用中可以选择性的下载需要的插件

Android应用插件式开发解决方法[转]

一.现实需求描述 一般的,一个Android应用在开发到了一定阶段以后,功能模块将会越来越多,APK安装包也越来越大,用户在使用过程中也没有办法选择性的加载自己需要的功能模块.此时可能就需要考虑如何分拆整个应用了. 二.解决方案提出 一般有两种方式,一种是将应用按照功能分拆成多个应用,用户需要哪个就下载哪个,都需要就都下载.应用之间,可以在代码层面做一定的关联,以共享部分信息.另一种方式,类似于其他平台插件的方式,用户可以在主应用中可以选择性的下载需要的插件,不需要该功能,则不需要下载. 第一种

插件式架构设计(转)

1.         基本架构 应用程序由应用程序框架.插件接口.插件和公共函数库四部分组成. 应用程序框架负责应用程序的整体运作,它清楚程序整个流程,但并不知道每个过程具体要做什么.它在适当的时候调用一些插件,来完成真正的功能. (设计师一定要站在更高的角度,去理清整个流程) 插件接口是一个协议,可能用IDL描述,可能是头文件,也可能一段文字说明.插件按照这个协议实现出来,就可以加入到应用程序中来.当然,对于复杂的系统,插件接口可能有多个,各自具有独立的功能. (可以设计成接口, 即协议.契约

基于.net插件式架构组装的 大数据抽取平台

点击进入体验 数据库链接: 可以管理mysq/sqlserver/oracle的数据库链接,状态为连接状态,保证数据正常抽取抽取任务管理:      可以新增  一次性抽取/增量抽取 任务  ,3种数据库之间任意切换 可以查看抽取日志: 可以查看抽取结果数据 后期待开发功能:数据库创建,备份,还原表管理,字段注释维护存储过程管理,视图管理,根据数据库生成 实体,增删改查代码

企业信息化解决方案——插件式平台开发框架

0.三板斧 作为职业Programmer或是优秀Team,拥有一套成熟.稳定的开发框架,无疑是行走IT江湖.纵横IT市场的必备功底. 无图无真相,作为一个讲究实效的ITer,先来几道的甜点凉菜,后续会上更多的硬菜啦~o(∩_∩)o ~ 0.1 平台登录界面 0.1.平台登录界面 平台登录模块的设计兼顾了安全性和易用性.只有合法授权且状态正常的用户才能登录到平台.同时为方便用户使用,在确保电脑使用者相对唯一的情况下,可以选择保存登录信息,系统会自动对用户的相关登录信息采取加密手段后进行存储. 0.

mysql的插件式的存储引擎

转载 https://www.zhihu.com/question/19866767/answer/14942009 http://whuai.blog.51cto.com/3539000/862197 Oracle: 数据文件包括:控制文件.数据文件.重做日志文件.参数文件.归档文件.密码文件.这是根据文件功能行进行划分,并且所有文件都是二进制编码后的文件,对数据库算法效率有极大的提高.由于Oracle文件管理的统一性,就可以对SQL执行过程中的解析和优化,指定统一的标准:RBO(基于规则的优

插件式框架平台

二.插件式框架平台 以插件编程为指导思想,动态反射调用组件为行动方针,深入调研.设计.编码,初步形成现代化软件架构. 简介 有了理论指导,就需要用实践去验证.所谓知行合一. 作为一款通用插件式开发框架,基础的插件内核是整个平台的核心.鉴于平台的通用性和易用性,还插件式的提供以下常用基础模块功能: 1. 工作流组件 2. 权限系统组件 3. 自动更新组件 4. 自定义UI套件 5. 轻量级ORM 6. 字典管理 7. 通用类库 2.1 插件内核 本平台的插件内核开发借鉴了SD中服务和插件树思想,以

C# 插件式开发

在网上找了下插件式编程的资料,这里自己先借鉴下别人的,同时发现有自己的看法,不过由于本人水平有限,不一定有参考价值,写出来一方面是为了总结自己,以求提高,另一方面也希望各为朋友看到我的不足,给我提出宝贵意见. 什么是插件式编程 提起插件式,我们首先想到的是firefox,用过firefox的人都知道它是一个插件式程序.当一个功能需要,完全可以从网上下载一个插件后,重启后,就能使用.这个功能给我们带来许多的方便之处,这就是插件式程序的好处. 插件的本质在于不修改程序主体(平台)的情况下对软件功能进

ctkPlugin插件系统实现项目插件式开发

插件式开发体会: 自开始写[大话QT]系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有挑战性的,为了这周总还专门找我谈了谈,算是“安抚”民心吧.正式谈话过后,我才决定接手渲染客户端的开发. 渲染客户端的所有构成均是采用开源框架拼凑起来的整体,细分它的组成大致包含以下开源模块,简单描述: 1> CTKPlugin插件系统框架.负责整个项目的架构,决定了项目采用插件形式开发维护. 2>