使用IClock和DI时如何在实体中引用DateTime.Now?

时间:2011-12-07 15:16:26

标签: c# dependency-injection

我非常希望this suggestion on 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 个答案:

答案 0 :(得分:2)

如果您要使用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;提供者的链接问题的接受答案。

答案 1 :(得分:0)

如果您的依赖注入框架具有类似于spring的autowire,那将解决您遇到的问题。见Section 4.3.8