基于XML源的DisplayNameAttribute扩展能否在运行时更新?
问题根本原因
.NET Framework中自定义特性的实例会在对应成员(此处为模型属性)首次被反射访问时完成初始化,之后被.NET运行时全局缓存,除非应用域重启,不会重新创建特性实例。你当前的实现是在构造函数中就调用TextGetter.GetText拿到翻译值传给基类,相当于翻译值在特性第一次初始化时就被固定存储,后续XML修改自然不会触发更新。
这种场景完全可以通过修改特性实现修复,不需要全盘替换特性标注方案,也不需要做大量视图重构,修复成本远低于更换实现方案。
修复代码
不需要改动已有模型的特性标注,仅修改LocalizedDisplayNameAttribute的实现逻辑,重写DisplayName属性的Getter,每次访问时实时拉取最新翻译即可:
[AttributeUsage(AttributeTargets.Property)] public sealed class LocalizedDisplayNameAttribute : DisplayNameAttribute { private readonly string _key; private readonly string _page; public LocalizedDisplayNameAttribute(string key, string page = null) { // 仅存储键参数,不提前计算翻译值 _key = key; _page = page; } public override string DisplayName { get { if (string.IsNullOrWhiteSpace(_key)) return string.Empty; return string.IsNullOrWhiteSpace(_page) ? TextGetter.GetText(_key) : TextGetter.GetText(_key, _page); } } }
该实现下每次MVC框架读取属性显示名称时,都会实时从TextGetter拉取最新内容,只要你的TextGetter本身已经支持XML修改后返回最新值,改完特性就能立刻生效,几乎无重构成本。
可选优化
如果担心每次读取都查询XML存在性能损耗,可以给TextGetter增加内存缓存,同时监听XML文件变更,文件修改后自动清空缓存即可,兼顾性能和动态更新需求。
内容的提问来源于stack exchange,提问作者Frederik T
相关产品推荐
相关产品推荐

