尽管在理论上使用对象隶属关系可以实现规模庞大、关系复杂、智能更新的对象网络,但在实际应用中对于隶属关系的使用还是有些基本规则和限制的,具体如下:
尽量避免建立循环引用关系。正常情况下应建立针对特定对象的单向依赖关系,而不应该建立相互依赖的双向依赖关系,因为这样的话,任何一方的改变都会引发另一方的改变,从而导致改变通知在两者之间不断的来回传递;在特定情况下一定要建立相互依赖的关系,则可以考虑采用如下方案:
正常建立相互依赖关系,但在两者的改变回调函数中准确分析以确定对方是否真的已发生改变,或者说对方的改变是否应该引起自身的改变,然后再基于分析结果按需改变自身,而不是在收到通知后始终改变自身;
设立一个中间对象来解耦相互依赖关系。比如: A和B两个对象需要相互引用并相互监测对方改变,则我们可以引入C对象,并设置C对象同时引用A和B对象,这样,当A和B中任意一方发生改变时C都会收到通知,此时C就可以根据实际情况修正另一方了,从而达到能相互通知但不循环依赖的要求。
被依赖对象必须是已持久化对象。在建立引用关系时,要求被依赖对象必须是已经添加Model中的对象,这是因为需要将用于唯一标识被依赖对象的标识符保存到依赖对象中,而对于尚未添加到Model中的对象而言,它并不具备此种标识符;从来源上看,被依赖对象通常与依赖对象位于同一Model中,也可以位于不同Model中,也可以位于不同DGN文件中,同时,也可以是不同类型的对象(图形对象与非图形对象),系统会自动识别并处理的。相较而言,对于引用对象则无要求,它可以是已持久化对象,也可以是尚未持久化的对象,只是在尚未持久化之前虽然可以保存被引用对象的记录,但无法接收并触发改变通知,直至持久化。
注意单依赖和多依赖约束。目前内置提供的两种依赖关系中,通用隶属关系不限制依赖的数量,亦即支持单个对象依赖于单个对象(1:1模式),单个对象依赖于任意多个对象(1:n模式),任意多个对象依赖于单个对象(n:1模式);但对于变换类型的隶属关系,系统仅支持单个对象依赖于单个对象(1:1模式)以及任意多个对象依赖于单个对象(n:1模式),不支持单个对象依赖于任意多个对象(1:n模式)。
两特定对象间不要使用多种隶属关系。在特定的两个对象间不要建立多个同向的隶属关系,不论其类型是否相同。例如: 已经建立了A <引用Type1 > B,就不要再建立A <引用Type2 > B,不论引用Type1与引用Type2的类型是否相同。这是因为不论何种类型的隶属关系,它们都是基于通用的隶属关系衍生出来的,在本质上有着统一性(都有专用的添加引用方法和修改响应函数)和唯一性(全局唯一的隶属关系标识符),最大的区别在于不同的衍生隶属关系具备不同的预定义行为(如自动组合变换矩阵),与此同时,所有类型隶属关系所使用的响应函数从本质上都是相同的(或称通用的)。所以,对同一对象无需使用多种隶属关系,在一种隶属关系中同样能处理。
现有隶属关系不支持跨Model复制,不支持深度克隆。由于底层平台的局限性,目前基于底层平台所建立的隶属关系机制无法支持跨Model的复制。例如: 在同一Model中建立了A引用B的关系,如果将A和/或B复制到另一个Model,则新的A和/或B之间的引用关系将会丢失,但不影响原有的关系;同样,即使在同一Model中,若只复制A或只复制B,则新的A或新的B与原有对象间的引用关系将会丢失;但是,在同一Model中,若同时复制A和B,则原有A和B之间的引用关系会映射为新的A和新的B之间的引用关系。在后期的平台扩展中,我们将逐步突破这一局限性。