Abstracting the DateTime.Current dependency
Is there a nuget package, or other "standard" that wraps the hard dependency created when your code is coupled to DateTime.Now
?
I'm seeking guidance on this before writing my own. Albeit that it's trivial to do so, I'd rather use something that exists if it already does as somewhat of a standard.
I very much doubt that there's any nuget package for anything quite so trivial - a single interface and probably two implementations ("system" clock and a fake one for testing).
If you're doing one of these yourself, I would strongly consider making the clock return a DateTimeOffset
instead of a DateTime
, or at least make it wrap DateTime.UtcNow
... DateTime.Now
is a problem waiting to happen...
However, Noda Time contains all of this out of the box. You probably don't want the whole of Noda Time just for this reason, mind you...
(There's a Noda Time nuget package, but it's definitely pre-release. I need to update it to a 0.2 version at some point, but it's still not at the v1 level yet. Getting there though...)
If you want a really cheap-and-cheerful way of expressing the dependency, you could always take a Func<DateTime>
or Func<DateTimeOffset>
wherever you normally express dependencies. The interface approach is cleaner though :)
I dont know of any nuget package that does this. When I've run into this problem I've simply created my own type like this:
public static class SystemTime
{
public static Func<DateTime> Now = () => DateTime.Now;
}
That way in your unit tests you can easily change the functionality of Now to return any DateTime you want.
Suppose we have a method:
public void Foo() {
var now = DateTime.UtcNow;
Record(now);
The solution i always employ anytime I need DateTime.Now
is:
public void Foo(DateTime? now = null) {
Record(now.GetValueOrDefault(DateTime.UtcNow));
链接地址: http://www.djcxy.com/p/55760.html
上一篇: 最后一个新行?
下一篇: 抽象DateTime.Current依赖