PB语言实现控制反转(IoC)

PB语言实现控制反转(IoC)

PBIoC是一个以C++开发的,实现PB语言控制反转功能的项目。基于此项目,PB能够将对象的生命周期、依赖关系以及属性的加载托管给IoC容器。

1、项目构成

本项目包含的类及相应功能说明如下:

类名功能
PBIoCIoC容器,管理组件的生命周期、依赖关系、属性自动装配
PBComponent组件,在IoC容器中以单例模式存在

2、项目依赖

PB10及以上环境,项目中导入PowerProject.IoC.dll即可使用

3、功能概要

3.1、PBIoC

PBIoC为IoC容器,主要有以下功能:

1. 加载配置信息初始化容器
2. 获取容器中的组件,按配置信息创建对象、窗口和控件
3. 按配置信息批量注入全局变量、共享变量、实例变量

方法列表如下:

方法名参数列表说明
load_configstring加载配置文件
set_configstring, string, any设置配置信息
scan_libraries扫描当前项目PBL或PBD,创建组件
scan_librarystring, …扫描具体的PBL或PBD,创建组件
get_componentstring按名称获取组件对象
new_objectstring按类名创建对象并注入属性
open_windowstring按窗口名打开窗口并注入属性
open_windowstring, Window按窗口名打开子窗口并注入属性
open_userobjectstring, GraphicObject, int, int按控件类名创建控件并注入属性
open_tabstring, Tab创建页签对象并注入属性
load_global_variables注入全局变量
load_shared_variablesstring注入共享变量
load_instance_variablesPowerObject注入对象的实例变量

3.2、PBComponent

PBComponent为容器组件,主要有以下功能:

  1. 组件的继承类能够被IoC容器扫描,从而在容器中实例化该组件
  2. 动态访问自身的属性和方法

方法列表如下:

方法名参数列表说明
get_fieldstring按名称获取属性值
set_fieldstring, any按名称设置属性值
invoke_methodstring按方法名动态调用无参方法
invoke_methodstring, any, …按方法名动态调用有参方法
invoke_method_with_signaturestring, string按方法名及方法签名动态调用无参方法
invoke_method_with_signaturestring, string, any, …按方法名及方法签名动态调用有参方法

4、快速入门

4.1、注入组件属性并从容器获取组件的实例

  1. 创建 PBComponent 的子类 n_animal ,编辑实例变量:

    public:
    	string name
    	int age
    	date birth_date
    	boolean alive
    
  2. 创建配置文件 application.json,内容如下:

    {
    	"n_animal":{
    		"name":"Jar",
    		"age": 2,
    		"birth_date":"2021-03-14",
    		"alive":true
    	}
    }
    
  3. application 创建全局变量:

    PBIoC ioc
    

    application open 事件编辑代码,创建 PBIoC 实例并加载配置文件、扫描当前PBL:

    ioc = create PBIoC
    ioc.load_config('application.json')
    ioc.scan_libraries()
    
  4. 执行以下代码:

    n_animal a
    a = ioc.get_component('n_animal')
    
  5. 执行结果如下:

在这里插入图片描述

4.2、打开窗口自动注入实例变量

  1. 创建窗口 w_test ,编辑实例变量:

    private:
    	string user_name
    	datetime login_time
    
  2. 编辑配置文件 application.json,内容如下:

    {
    	"w_test":{
    		"user_name":"Jason",
    		"login_time":"2023-03-24 20:48:00"
    	}
    }
    
  3. application 创建 PBIoC 全局变量及 open 事件与4.1一致

  4. 执行以下代码:

    window w
    w = ioc.open_window('w_test')
    
  5. 窗口正常打开,执行结果如下:

在这里插入图片描述

4.3、调用对象的Setter方法注入属性

  1. 修改4.1中的 n_animal 类,增加方法:
    在这里插入图片描述

  2. 配置文件、application 创建 PBIoC 全局变量及 open 事件与4.1一致

  3. 执行以下代码:

    n_animal a
    a = ioc.get_component('n_animal')
    
  4. 执行结果如下:

在这里插入图片描述

  1. 跟4.1相比, n_animal 类存在 set_name 方法,注入 name 属性实际是调用了 set_name 方法,而非直接赋值 name 属性

WX、TEL:18649713925
QQ:768310524

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 一、 实现目标 4 二、 框架构思及概念图 4 三、 数据类(DataClass) 5 3.1、 系统对象信息(D_SYSOBJECTS) 5 3.2、 系统字段信息(D_SYSCOLUMNS) 6 3.3、 主外键关系(D_SYSFOREIGNKEYS) 6 四、 资源类(ResourceClass) 7 4.1、 框架参数(FrameworkParameter) 7 4.2、 数据元素字典D_DATAELEMENT(DataElement) 8 4.3、 字段属性表达式类(D_SYSCOLUMNS_ATTRIBUTES) 9 4.4、 系统参数字典(D_SYSPARMDICT) 9 五、 信息类(InformationClass) 10 六、 功能类(FunctionClass) 10 七、 组织类(OrganizeClass) 11 7.1、 角色(Role) 11 7.2、 操作员(Operator) 11 八、 框架设计结构图 11 8.1、 数据项属性表达式部分 11 九、 窗口基类设计 12 9.1、 带有提示栏的窗口 12 十、 数据窗口服务及相关对象 13 10.1、 框架参数对象(uo _FrameworkParameter) 13 10.2、 表达式替换 14 10.3、 操作员数据权限(my_n_cst_dwsrv_popedom_data) 15 10.4、 修改属性表达式(my_n_cst_dwsrv_ModifyDWExpression) 15 10.5、 修改字段显示标题(my_n_cst_dwsrv_ModifyColumnTitle) 16 10.6、 关联查询服务(my_n_cst_dwsrv_RelationSearch) 16 10.7、 GRID风格DW打印服务(my_n_cst_dwsrv_DWPrint) 18 10.8、 DW显示风格设置(my_n_cst_dwsrv_ViewStyle) 19 10.9、 系统字典维护工具 20 10.9.1、 数据结构字典定义 20 10.10、 允许用户进行自定义的参数(D_SYSCONFIG) 21 十一、 简单业务流程处理(Simple Business Flow) 22 11.1. 简单业务流程的定义 22 11.1.1. 业务流程中环节的定义 23 11.1.2. 业务流程的实例化 24 11.1.3. 任务数据的检索 26 11.1.4. 业务流程处理引擎(my_n_cst_workflowengine) 27 11.1.5. 界面设计 31
控制反转(Inversion of Control,简称IoC)和依赖注入(Dependency Injection,简称DI)是两个相关的概念,用于解耦和管理对象之间的依赖关系。 控制反转IoC)是一种设计原则,它将对象的创建和管理权从应用程序代码中转移到容器中。传统的程序设计中,对象之间的依赖关系由对象自己创建和管理,而在IoC中,容器负责创建和管理对象,并将它们注入到需要它们的地方。 依赖注入(DI)是实现IoC的一种方式。它通过将依赖关系作为参数传递给对象,或者通过使用容器来自动注入依赖关系,来实现对象之间的解耦。依赖注入可以通过构造函数注入、属性注入或者接口注入等方式来实现。 下面是一个简单的示例来说明IoC和DI的概念: 假设我们有一个UserService类,它依赖于一个UserRepository类来获取用户数据。在传统的程序设计中,UserService需要自己创建UserRepository对象并管理它的生命周期: ```java public class UserService { private UserRepository userRepository; public UserService() { userRepository = new UserRepository(); } public User getUserById(int id) { return userRepository.getUserById(id); } } ``` 而在使用IoC和DI的方式下,我们可以将UserRepository的创建和管理交给容器来处理,UserService只需要声明它所依赖的UserRepository,并通过构造函数或者属性注入的方式接收它: ```java public class UserService { private UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } public User getUserById(int id) { return userRepository.getUserById(id); } } ``` 在这个示例中,UserService不再负责创建UserRepository对象,而是通过构造函数接收一个UserRepository对象。这样,我们可以通过容器来创建UserService,并将一个UserRepository对象注入到它中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值