加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 专门针对现在呈现的DateTime创建一个包装器是个好主意吗?

发布时间:2020-12-16 02:02:01 所属栏目:百科 来源:网络整理
导读:我最近注意到,使用表示’now’的DateTime作为方法的输入参数,用于模拟和测试目的非常好.而不是每个调用DateTime.UtcNow的方法本身,我在上层方法中执行一次,然后在下层方法中执行. 所以很多需要’now’的方法现在都有一个输入参数DateTime. (我正在使用MVC,并
我最近注意到,使用表示’now’的DateTime作为方法的输入参数,用于模拟和测试目的非常好.而不是每个调用DateTime.UtcNow的方法本身,我在上层方法中执行一次,然后在下层方法中执行.

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

(我正在使用MVC,并尝试检测一个名为now的参数和modelbind 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,当有人试图在正常的DateTime中进行操作时,我们将得到编译错误.

当然你仍然可以解决这个问题,但至少如果你觉得你做错了什么的话.
有没有人进过这条道路?从长远来看,我没有考虑过任何好的或坏的结果吗?

解决方法

您可以创建具有必要属性的接口.即IClock并将其作为依赖注入.

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和其他什么怎么办?你会为此单独添加三个参数吗?

我建议使用这种接口技术来避免使用过多参数的丑陋代码,这些参数对您没有多大帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读