Design patterns 在多层体系结构中,应在何处转换表示值?
我正在构建一个多语言、多时区和n层的应用程序。所有日期均以UTC格式存储在数据库中,所有模型对象均填充UTC时间。但是,从不显示UTC时间(除非用户碰巧将时区设置为UTC) 这意味着我需要重复地将时间属性转换为正确的用户时区。重复总是坏代码的标志或更好的方式,所以我试图找出最佳的实现策略。虽然这实际上是一种表示逻辑,但我的想法有所不同,因为模型似乎应该知道当前用户的正确值。到目前为止,我的想法是:Design patterns 在多层体系结构中,应在何处转换表示值?,design-patterns,architecture,timezone,Design Patterns,Architecture,Timezone,我正在构建一个多语言、多时区和n层的应用程序。所有日期均以UTC格式存储在数据库中,所有模型对象均填充UTC时间。但是,从不显示UTC时间(除非用户碰巧将时区设置为UTC) 这意味着我需要重复地将时间属性转换为正确的用户时区。重复总是坏代码的标志或更好的方式,所以我试图找出最佳的实现策略。虽然这实际上是一种表示逻辑,但我的想法有所不同,因为模型似乎应该知道当前用户的正确值。到目前为止,我的想法是: 使用静态帮助器类,然后在每次使用模型的属性时调用它。这似乎容易出错或被遗忘,并使计算变得繁琐 在v
我仍然对更好的解决方案持开放态度,并对我当前的解决方案提出批评。我假设是您的模型层知道用户的时区,因此转换时间属性取决于模型层。否则,您必须让表示层知道时区,并在那里转换每个时间值 在模型层中转换时间值将允许在表示层中使用它们,而无需任何转换,因此我认为这将是干净的。例如,您可以在开始时使用转换的时间初始化对象(POCO)。但是要小心在模型中重新转换它们,忘记它们已经初始化为本地时间。此外,如果用户可以编辑时间值,则需要在保存之前将其转换回UTC时间 更新: 经过进一步思考,我认为UTC时间是模型的一部分,localtimes是该模型的一个视图,因此转换职责更多地属于表示层(以我不同意为代价)。使用相同的思维过程,将localtime属性与UTC时间一起使用本质上是重复的,转换仍然在模型层中。为了克服这个问题,用户POCO中可能有一个只读的
UTCToLocalTimeConverter
-type属性,该属性用时区初始化(这也消除了对静态方法的需要)。然后,页面中对时间属性的所有调用都将封装在转换器的ConvertToLocalTime
方法中,该方法可通过用户访问。如果愿意,也可以将转换器实例直接放在会话中
我不知道这种方法是否适用于您,但它是受您的策略启发而来的,我认为设计的其余部分以这种方式运行更为顺畅。此外,到localtimes的转换仍由客户自行决定。缺点是必须转换客户端中的所有时间值,但在我看来,这是摆脱数据重复和静态方法的必要条件。我想这是我的观点之一,我的模型层是否应该知道用户所在的时区?目前没有。我的内部争论是这是演示还是模型层决策。用户POCO存储时区,但用户POCO存储时区