c# – 专门针对现在呈现的DateTime创建一个包装器是个好主意吗?
我最近注意到,使用表示’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和其他什么怎么办?你会为此单独添加三个参数吗? 我建议使用这种接口技术来避免使用过多参数的丑陋代码,这些参数对您没有多大帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |