资讯详情

资讯详情

实时读取配置最新值

先说结论可以改成 static但是你现在这种写法有一个隐藏致命大坑就算加上 static 也会出BUG。先看你当前代码的问题publicclassPipeTopologyConfiguration{publicdoubleTolerancePipeTopologyConfig.Instance.Tolerance;publicstringLxFieldPipeTopologyConfig.Instance.LxField;publicstringFxValuePipeTopologyConfig.Instance.FxValue;}这几个是实例字段只有你new PipeTopologyConfiguration()创建对象的时候才会从单例读取一次值然后复制一份快照。⚠️数据库配置后期修改、刷新缓存之后这几个值不会自动更新永远是第一次new时读到的旧值方案1直接改成静态字段❌依旧有快照过期问题不推荐publicclassPipeTopologyConfiguration{publicstaticdoubleTolerancePipeTopologyConfig.Instance.Tolerance;publicstaticstringLxFieldPipeTopologyConfig.Instance.LxField;publicstaticstringFxValuePipeTopologyConfig.Instance.FxValue;}缺陷静态字段只在第一次访问类的时候赋值 1 次。你在界面修改数据库配置调用LoadAllFromDatabase刷新了PipeTopologyConfig的缓存但是PipeTopologyConfiguration.Tolerance不会跟着变一直保留旧数值出现新旧配置两套数值拓扑计算容差不生效非常难排查。方案2最优写法 —— 静态只读属性✅推荐实时读取最新值不要存一份副本每次外部读取的时候现场去单例拿最新的数据配置修改后立刻生效零缓存过期问题。publicstaticclassPipeTopologyConfiguration{publicstaticdoubleTolerancePipeTopologyConfig.Instance.Tolerance;publicstaticstringLxFieldPipeTopologyConfig.Instance.LxField;publicstaticstringFxValuePipeTopologyConfig.Instance.FxValue;}是表达式体属性没有后台字段每次访问都会执行右边代码实时从单例获取最新值。调用方式完全没变旧代码一行不用改doubletolPipeTopologyConfiguration.Tolerance;对比三种方式的区别写法读取时机配置修改后能否自动拿到新值实例字段public double Tolerance ...new对象时读取一次❌过期静态字段public static double Tolerance ...首次访问类读取一次❌过期静态属性public static double Tolerance ...每次读取都去拿✅实时最新为什么建议直接做成 static classpublicstaticclassPipeTopologyConfiguration{publicstaticdoubleTolerancePipeTopologyConfig.Instance.Tolerance;publicstaticstringLxFieldPipeTopologyConfig.Instance.LxField;publicstaticstringFxValuePipeTopologyConfig.Instance.FxValue;}不需要new兼容你所有历史旧代码起到一层别名兼容层以后就算底层配置实现改了上层业务代码完全不用动永远实时读取数据库刷新后的最新参数不会出现配置改了但是程序仍然用旧容差的隐蔽BUG。如果你原来大量业务代码已经写死PipeTopologyConfiguration.Tolerance这套就是完美兼容过渡方案不需要到处改代码只把这个类换成上面静态属性版本即可。如果你需要我也可以给你一份带注释、完整可以直接覆盖粘贴的最终版代码。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →