上一节主要介绍ZProperty的单体结构,这一节主要说明属性间的关联。
Link(属性)关系分类
可以定义属性与属性间的关联,方便基于属性框架的开发。主要的关联关系包括:聚合、关联、视图
接口与聚合
即通过一个属性引用另一个类的对象。 ZP内容类支持 接口(interface
)做为值(Value),如下所示 多用于引用一个对象,即可以理解为对象间的关联。(UML中的聚合或者组合的关系)
public ZProperty<int> CardID = new ZProperty<int>();
public ZProperty<ICard> CardProp = new ZProperty<ICard>();
如上面的例子,通过ICard接口,可以指定不同的派生值类,通过CardId进行标识要引用的对象。
还可以以另一种方式比较对象间的聚合关联关系,即使用ZPropertyInterfaceRef
接口引用 ZProRx为了简化上面的使用方式,引入ZPropertyInterfaceRef
属性类,通过其成员RefID
,标识引用的对象,即实现ICard接口的实例。
public ZPropertyInterfaceRef<ICard> CardRef = new ZPropertyInterfaceRef<ICard>(OnLink);
其中构造参数是用于定义关联的方法,其会返回,聚合的对象。 类似的还有ZPropertyRefList
属性类,用于定义引用对列。
总结:可以看到两种方式,前者需要通过ID手动进行聚合。
View 视图
类似Mysql视图的概念 视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);可以跟基本表一样,进行增删改查操作(ps:增删改操作有条件限制); 从面向中数据开发的角度出发,视图就是数据源的进行不同层次的映射、汇总、抽象,每一层次为不同业务进行服务,方便逻辑处理,提升开发效率。对视图、数据的设计很重要,它是上层设计的基石。基础打不好,后面早晚会出现问题。也可以把其理解为观察者模式。
ZProperty框架引入Select/Where/Merge/Count/Sum等方法,对源数据进行处理,生成不同的视图。它与Linq很想,用过的一定会很喜欢Linq的强大,其实作用是一样的,其核心还是面向数据的。不过LINQ生成的还不能叫视图,因为如果源变化时,视图不会进行更新,这是因为Linq是基础框架,面向的List这些基础类,但在ZProperty的基础上,我们就能做的真正的视图,视图会根据源进行动态变更。其实原理很简单就是注册相应的事件。
主要视图方法如下:
- Select:对数据源进行变换,数据量是一致的,数据内容进行变换
- Where: 对数据源进行有条件的映射,数据量会变为满足条件的数据量,数据内容不变。
- Merge:对多个数据源进行合并。数据量是总和,数据内容保持不变。
- Count: 数据源的数量,映射到一个变量中。
- Sum:数据源(ZPropertyList/ZPropertyRefList)的各项和,可以根据条件对项目进行选择,同时也支持对求和的方式进行配置。 目前Sum视图只支持
uint/int/float/double
类型的Sum视图 - Cache: 用于缓存,即到达一定的数量之后,进行删除,不会主动删除元素,即只会监听数据源的Add操作。
- Sort:排序、当数据源Add/Del操作时,会进行重新的排序
注意:以上Select/Sum/Cache/Sort等,只有ZPropertyRefList
才能做为视图,因为表达的是引用的关系。而ZPropertyRefList
和ZPropertyList
都可以做为数据源。 ,如果ZPropertyList
做为数据源,其T值 一定是可以索引的,即实现了 IIndexable
接口的对象,否则会创建视图失败 每一个视图方法调用后,会返回一个IDisposable,可以调用其对关联进行取消,解除与属性的视图关联。
关联
有关关联的定义的,可以参考 视图之后,引入另一个概念“关联”,也就是把两个Property(数据)进行关联。 视图也是一种特殊的关联。 其实各数据、普通的Property组成的只是一个树形/森林的结构, 正常的Property框架,一个对象可以向下访问其结构中的Property。 而我们希望的Property组合成了一个大的 Mesh,需要具有横向、向上或者任意的联结,以保证逻辑需要。 比如一子弹打中物体后,需要知道其发射者的信息,完成记录功能。
注意与视图的区别:
- 视图也是单向的关联。
- Select只是观察者,是单向的,而Link有双向的同步功能。
- Link同步可支持进行设置,同时内部也是实现的是Select
注意问题: 目前Link的时机还是比较早的。会被接口隔断。除非是接收其对应的OnValueChange
视图与关联,是否需要考虑可见性的问题。
相关链接:
项目开源地址:https://github.com/bennychao/ZProRx.Lib
下载安装:(ZP.Lib.Server 是ZRroRx的核心库,后续其它功能库陆续开放中)
- .Net CLI
>dotnet add package ZP.Lib.Server --version 1.0.3
- 或 VS 2019 Nuget 包管理中搜索"ZP.Lib.Server"并安装(推荐)
ZProRx.Lib Unity Package 1.0.3 (用于在Untiy中使用)下载地址:
https://github.com/bennychao/ZProRx.Lib/releases/
https://github.com/bennychao/ZProRx.Lib/Publish/ZProRx.Lib.package
下一节