Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 329
Chris Marisic Avatar asked Oct 21 '11 15:10

Chris Marisic


2 Answers

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 :)

like image 99
Jon Skeet Avatar answered Oct 31 '22 23:10

Jon Skeet


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.

like image 20
Kevin Holditch Avatar answered Oct 31 '22 22:10

Kevin Holditch