我非常希望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中检索实体,那仍然需要我显式设置。
答案 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