gpt4 book ai didi

c# - 专门为代表 Now 的 DateTime 制作一个包装器是个好主意吗?

转载 作者:行者123 更新时间:2023-11-30 13:56:54 25 4
gpt4 key购买 nike

我最近注意到,出于模拟和测试目的,使用表示“现在”的 DateTime 作为方法的输入参数非常好。我不是每个方法都自己调用 DateTime.UtcNow,而是在上层方法中执行一次,然后将其转发到下层方法。

所以很多需要“现在”的方法都有一个输入参数DateTime now

(我正在使用 MVC,并尝试检测名为 now 的参数并将 DateTime.UtcNow 模型绑定(bind)到它)

所以代替:

public bool IsStarted
{
get { return StartTime >= DateTime.UtcNow; }
}

我通常有:

public bool IsStarted(DateTime now)
{
return StartTime >= now;
}

目前我的约定是,如果一个方法有一个名为 nowDateTime 参数,您必须将当前时间提供给它。当然,这归结为约定俗成,其他人可以轻松地将其他一些 DateTime 作为参数放入其中。

为了使其更加可靠和静态类型化,我正在考虑将 DateTime 包装在一个新对象中,即 DateTimeNow。因此,在最上层之一,我会将 DateTime 转换为 DateTimeNow,当有人试图修改正常的 DateTime 时,我们会遇到编译错误。

当然你仍然可以解决这个问题,但至少如果你觉得你做错了什么。有没有其他人走上这条路?从长远来看,有什么好或坏的结果是我没有考虑到的吗?

最佳答案

您可以创建具有必要属性的接口(interface)。即 IClock 并将其作为依赖项注入(inject)。

interface IClock
{
DateTime Now { get; }
DateTime UtcNow { get; }
}

class SystemClock : IClock
{
public DateTime Now { get { return DateTime.Now; } }
public DateTime UtcNow { get { return DateTime.UtcNow ; } }
}

class TestDoubleClock : IClock
{
public DateTime Now { get { return whateverTime; } }
public DateTime UtcNow { get { return whateverTime ; } }
}

这样您就可以轻松地对依赖于 DateTime 的代码进行单元测试。到处传递 DateTime.Now 作为参数听起来很糟糕。如果您需要 Now 以及 UtcNow 和其他东西怎么办?您会为此单独添加三个参数吗?

我建议使用这种接口(interface)技术来避免使用太多参数的丑陋代码,因为这些参数对您没有多大帮助。

关于c# - 专门为代表 Now 的 DateTime 制作一个包装器是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23981268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com