EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 546|回复: 0
打印 上一主题 下一主题

[架构模式] 插件式程序开发及其应用(C#) - 1

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12408

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-10 10:58:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
起因:欲开发一报表系统,能动态加载报表程序
该系统基于插件式架构,即除了登录程序和主程序外,其它所有功能均通过后期加载的方式调用,每个组件实现一个特定的报表(或其它功能)        
基本思路:        
1)登录程序        
判断用户身份,并根据参数判断能否进入系统,验证通过后返回所有用户资料(权限、基本信息)      
参数:子系统代码      
权限信息:可用功能列表      
基本信息:个人信息、科室信息      
2)主画面        
获取上述信息并存于全局对象中      
主画面可以实现基本功能,如修改密码、日志查询等      
主画面实现插件加载功能,并把用户信息传入组件      
主画面在加载插件之前需进行有效性验证,即判断用户权限、判断各个接口方法是否有效      
主画面实现插件间通讯功能,允许各个组件通过把数据共享      
3)插件        
提供有效性验证功能,提供权限要求      
能获取主画面传入的用户信息,并存入特定对象中      
插件间通讯功能      
        
        
一、动态加载控件         
动态加载,最基本用到的就是反射机制。在System.Reflection的namespace下有一系列的关于获取Assembly信息、类(型)信息的类、接口、结构等:         
        
//加载控件         
Assembly assembly = Assembly.LoadFrom(@"C:/Controls.dll");         
//获得类(型)         
Type type = assembly.GetType("Controls.UserControl",false,true);         
//设置筛选标志         
BindingFlags bflags = BindingFlags.DeclaredOnly | BindingFlags.Public         
| BindingFlags.NonPublic | BindingFlags.Instance;         
//调用构造函数并获得对象         
Object obj = type.InvokeMember("UserControl", bflags |         
BindingFlags.CreateInstance, null, null, null);         
//将对象转换类型         
System.Windows.Forms.Control c = (Control)obj;         
//将控件添加到窗体         
this.Controls.Add(c);         
        
下面对上面程序段用到的一些变量、方法做一点说明         
1、BindingFlags,枚举类型         
BindingFlags.Instance : 对象实例         
BindingFlags.Static : 静态成员         
BindingFlags.Public : 指可在搜索中包含公共成员         
BindingFlags.NonPublic : 指可在搜索中包含非公共成员(即私有成员和受保护的成员)         
BindingFlags.FlattenHierarchy : 指可包含层次结构上的静态成员         
BindingFlags.IgnoreCase : 表示忽略 name 的大小写         
BindingFlags.DeclaredOnly : 仅搜索 Type 上声明的成员,而不搜索被简单继承的成员         
BindingFlags.CreateInstance : 表示调用构造函数。忽略 name。对其他调用标志无效         
        
2、Type.InvokeMember         
public object InvokeMember(         
string name,         
BindingFlags invokeAttr,         
Binder binder,         
object target,         
object[] args         
);         
参数         
name         
  String,它包含要调用的构造函数、方法、属性或字段成员的名称。空字符串 (""),表示调用默认成员。         
invokeAttr         
  一个位屏蔽,由一个或多个指定搜索执行方式的 BindingFlags 组成。 访问可以是 BindingFlags 之一,如Public、 NonPublic、Private、 InvokeMethod 和         
  GetField 等。不需要指定查找类型。如果省略查找类型, 则将应用 BindingFlags.Public | BindingFlags.Instance。         
binder         
  一个 Binder 对象,该对象定义一组属性并启用绑定,而绑定可能涉及选择重载方法、 强制参数类型和通过反射调用成 员。 若为空引用,则使用 DefaultBinder。         
target         
  要在其上调用指定成员的 Object。         
args         
  包含传递给要调用的成员的参数的数组。         
返回值         
  表示被调用成员的返回值的 Object。   
二、插件架构

      

                               
登录/注册后可看大图

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对
工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|EaBIM网 ( 苏ICP备2020058923号-1  苏公网安备32011502011255号

GMT+8, 2024-11-30 18:13

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表