【发布时间】:2014-07-21 18:54:35
【问题描述】:
我最近注意到,使用代表“现在”的 DateTime 作为方法的输入参数非常好,用于模拟和测试目的。我不是每个方法都自己调用DateTime.UtcNow,而是在上层方法中执行一次,然后在下层方法中转发。
所以很多需要“现在”的方法,都有一个输入参数DateTime now。
(我正在使用 MVC,并尝试检测一个名为 now 的参数并将模型绑定 DateTime.UtcNow 到它)
所以而不是:
public bool IsStarted
{
get { return StartTime >= DateTime.UtcNow; }
}
我通常有:
public bool IsStarted(DateTime now)
{
return StartTime >= now;
}
所以我现在的约定是,如果一个方法有一个名为now 的DateTime 参数,则必须为其提供当前时间。当然,这归结为惯例,其他人可以轻松地将其他一些 DateTime 作为参数放入其中。
为了使其更加稳固和静态类型,我正在考虑将 DateTime 包装在一个新对象中,即 DateTimeNow。因此,在最上层之一中,我会将DateTime 转换为DateTimeNow,当有人试图摆弄正常的日期时间时,我们会遇到编译错误。
当然,你仍然可以解决这个问题,但至少如果你觉得你做错了什么。 有没有其他人走上这条路?从长远来看,有没有我没有考虑过的好的或坏的结果?
【问题讨论】:
-
您正在从属性更改为方法。你为什么不直接使用
return StartTime > DateTime.UtcNow?这是很多不必要的复杂性。 -
因为它使一些东西很难测试和耦合。在某种程度上,DateTime.UtcNow 只是另一种静态方法,其中包含不断变化的“状态”。
-
@JeroenVannevel 如果他这样做,他将无法测试它。
标签: c# dependencies