二、问题分析
a、API变化分析
Revit2022主要的变化,或者说我们最在意的变化,是通用单位表示的变化。以及依赖单位的其他对象的属性和方法都要做调整。我先展示一下Revit版本从2020到2022单位相关的那些对象是如何演变的。
黄色的枚举类型,2021变成了弃用,到2022由绿色的类型代替
DisplayUnitType(int)——>UnitTypeId(ForgeTypeId)
单位的表示,由DisplayUnitType枚举字段表示,变成了UnitTypeId静态类的只读属性一一对应。具体值由int——>ForgeTypeId(本质又是一个唯一的typeId(string))
另外在2021版,专门提供了一些有趣的方法,这些方法刚被引入,就被标记成过时。很显然这些方法就是给我们去做适配的时候临时使用获取内部对应关系的。比如UnitUtils里面这些方法
public static class UnitUtils
{
..................
[Obsolete("This method is deprecated in Revit 2021 and may be removed in a future version of Revit. It will not be replaced, but until its removal it may be used to help migrate code that uses the `DisplayUnitType` enumeration to the `ForgeTypeId` class.")]
public static DisplayUnitType GetDisplayUnitType(ForgeTypeId unitTypeId);
[Obsolete("This method is deprecated in Revit 2021 and may be removed in a future version of Revit. It will not be replaced, but until its removal it may be used to help migrate code that uses the `DisplayUnitType` enumeration to the `ForgeTypeId` class.")]
public static ForgeTypeId GetUnitTypeId(DisplayUnitType displayUnitTypeEnum);
..................
}
b、应用源码现有状态
这个枚举类型在项目中使用的也非常多。所以我们的兼容目标是:
1、开发人员使用起来一定要方便。
尽量维持原来旧版本的使用方式;尽一切努力减少程序开发人员对变化的感知;有一 定的技术策略能使开发人员方便的调用适配过后的功能。
2、要有一定的前瞻扩展性。
能抵御一定层次的RevitAPI变化所带来的冲击。这个以适应Revit变化趋势为的方案首选方案
3、封装变化的位置要统一,实现方案要稳定,可推导,可预测。
让程序人员可以迅速地建立使用新方案进行开发的思维体系;适配模块高度内聚化
4、核心变动要集中。
便于验证测试
总结:我们是不是可抽象出自定义的一层来表示单位。既不是DIsplayUnitType又不是ForgeTypeId。我们自己加个对象去表述单位,把这些逻辑串起来。没有什么事儿是加一个抽象层解决不了的。