相关疑难解决方法(0)

现有MVC5应用程序中Noda Time的实施策略

我们的应用程序是一个很大的n层ASP.NET MVC应用程序,它严重依赖于Dates和(local)Times.到目前为止,我们已经使用DateTime了所有模型,这些模型运行良好,因为多年来我们严格地是一个国家网站,处理单个时区.

现在情况发生了变化,我们正在为国际观众敞开大门.第一个想法是"哦,废话.我们需要重构我们的整个解决方案!"

的TimeZoneInfo

我们打开了LinQPad并开始绘制各种转换器,根据基于用户的配置文件中用户的TimeZone ID值创建的对象,将常规DateTime对象转换为DateTimeOffset对象TimeZoneInfo.

我们计算过,我们可以将所有DateTime属性的车型进入DateTimeOffset,并用它做.毕竟,我们现在拥有了存储和显示用户本地日期和时间所需的所有信息.

许多代码片段都受到Rick Strahl关于这一主题的博客文章的启发.

NodaTime和DateTimeOffset

但后来我读到了马特约翰逊的出色评论.他验证了我打算转而DateTimeOffset声称:"DateTimeOffset在Web应用程序中至关重要".

关于Noda Time,Matt说:

说到Noda Time,我不同意你的意见,你必须更换整个系统中的所有内容.当然,如果你这样做,你将有更少的机会犯错误,但你肯定可以在有意义的地方使用Noda Time.我个人致力于使用IANA时区进行时区转换的系统(例如"America/Los_Angeles"),但跟踪DateTime和DateTimeOffset类型中的所有其他内容.实际上很常见的是Noda Time在应用程序逻辑中广泛使用,但完全脱离了DTO和持久层.在某些技术中,如实体框架,如果您愿意,则无​​法直接使用Noda Time - 因为没有地方可以将其连接起来.

这可以直接针对我们,因为我们现在正处于这种情况,包括我们选择使用IANA时区.

我们的计划好还是坏?

我们的主要目标是创建最复杂的工作流程来处理不同时区的日期和时间.在我们的服务,存储库和控制器中尽可能避免时区计算.

简而言之,该计划是接受来自我们前端的本地日期和时间,在将信息保存到数据库之前,尽快将它们转换为a ZonedDateTime并将其转换为DateTimeOffset尽可能晚.

确定正确的关键因素ZonedDateTimeTimeZoneIdUser模型中的属性.

public class ApplicationUser : IdentityUser
{
    [Required]
    public string TimezoneId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

本地DateTime到NodaTime

为了防止大量重复代码,我们的计划是创建将本地转换DateTime …

c# timezone datetime datetimeoffset nodatime

17
推荐指数
1
解决办法
1425
查看次数

第三方类的TypeConverter属性

创建类时,可以使用TypeDescriptor.GetConverter(typeof(T))将TypeConverter属性应用于它,返回自定义类型转换器.例如:

[TypeConverter(typeof(FooConverter))]
public class Foo
{...}

public class FooConverter: TypeConverter
{...}

var tc = TypeDescriptor.GetConverter(typeof(T)); //returns a FooConverter instance.
Run Code Online (Sandbox Code Playgroud)

只要课程是我们制作的,这就有效.但是如何为我们无法修改源代码的类提供自定义TypeConverter?例如,如何为System.Version类(没有一个)提供自定义TypeConverter?

.net c# type-conversion typeconverter sealed

16
推荐指数
1
解决办法
2739
查看次数