Как ссылаться на DateTime.Now в сущностях при использовании IClock и DI? - PullRequest
2 голосов
/ 07 декабря 2011

Мне действительно нравится это предложение в StackOverflow , чтобы использовать интерфейс IClock для предоставления вашему коду текущей даты / времени, чтобы вы могли указать другую дату / время при модульном тестировании (не говоря уже о выделении всехссылок DateTime.Now).

Я могу использовать внедрение зависимостей для предоставления реализации этого интерфейса моему уровню обслуживания.

Однако у меня есть множество ссылок DateTime.Now в моих сущностях(образец ниже).Каков предпочтительный способ решения этой проблемы?

public class SampleEntity
{
  private DateTime someField;
  private DateTime someOtherDate;

  public SampleEntity()
  {
    someField = DateTime.Now;
  }

  public bool SomeProperty
  {
    get { return someOtherDate < DateTime.Now.Date; }
  }

  public bool SomeFunction()
  {
    return SomeOtherDate < DateTime.Now.Date;
  }
}

Я могу передать параметры в функцию и / или конструктор, но для этого все равно требуется, чтобы я что-то явно задал, если получаю сущность из ORM.

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

Если вы хотите использовать IClock, вам придется заменить все DateTime.Now на Clock.Now, и ваш класс возьмет экземпляр IClock в конструкторе:

public class SampleEntity
{
    private DateTime someField;
    private DateTime someOtherDate;
    private readonly IClock _clock;

    public SampleEntity(IClock clock)
    {
        _clock = clock;
        someField = clock.Now;
    }

    public bool SomeProperty
    {
        get { return someOtherDate < _clock.Now.Date; }
    }

    public bool SomeFunction()
    {
        return SomeOtherDate < _clock.Now.Date;
    }
}

Насколькокак прохождение конкретной реализации IClock при создании экземпляра сущности, большинство структур ORM предоставляют ловушки, которые можно использовать для предоставления пользовательских экземпляров сущностей.

Если ваш ORM не предоставляет такие ловушки, вы все равно можете использоватьпринятый ответ от связанного вопроса, который использует public static Func<DateTime> Now = () => DateTime.Now; провайдера.

0 голосов
/ 07 декабря 2011

Если в вашей среде внедрения зависимостей есть что-то похожее на autowire от spring, это решит проблему, с которой вы столкнулись.См. Раздел 4.3.8

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...