Sarebbe possibile pensare che DateTime.Now non sia esattamente adesso, ma che so, fra un'ora, domani, ieri, ...? Non sto delirando e non ho bevuto vino (sono tendenzialmente astemio)! L'esigenza di avere un concetto dell'istante corrente di tempo variabile nasce soprattutto per il testing.

Molto spesso il nostro domain model e' dipendente dal tempo. Si immagini ad esempio l'orario di partenza di un volo o del treno, l'inizio di un programma televisivo, l'orario di una transazione bancaria, ecc. ecc. Nasce quindi l'esigenza di testare il nostro modello ad oggetti in condizioni di tempo differenti, per verificare se a quella certa data ed ora si verificano le azioni che ci aspettavamo. Ci troviamo quindi di fronte a due scelte: aspettare che scatti l'ora X per verificare se scatta l'evento che ci aspettavamo, oppure portare avanti l'orologio.

Inutile dire che se aspettiamo diveniamo caffe' dipendenti :-) Molto meglio spostare l'orologio creandoci una nostra classe tempo:

public class DateTimeEx {
  public DateTimeEx() : this(DateTime.Now) { }

  public DateTimeEx(DateTime now) {
   this.now = now;
  }

  public DateTime Now {
   get { return now; }
  }

  private DateTime now;

Nulla di speciale o stravagante, ma se immaginassimo di implementare la suddetta classe arricchendola di funzionalita', potremmo potenziare notevolmente il nostro modello rendendolo decisamente piu' testabile.