gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:29:09 25 4
gpt4 key购买 nike

我很喜欢this suggestion on StackOverflow使用 IClock 接口(interface)为您的代码提供当前日期/时间,以便您可以在单元测试时提供不同的日期/时间(更不用说分解所有 DateTime.Now 引用了)。

我可以使用依赖注入(inject)来为我的服务层提供这个接口(interface)的实现。

但是,我的实体中有很多 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 检索实体,这仍然需要我显式设置一些内容。

最佳答案

如果你想使用IClock , 你将不得不更换所有 DateTime.NowClock.Now让你的类(class)参加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 框架提供可用于提供实体的自定义实例的 Hook 。

如果您的 ORM 不提供此类 Hook ,您仍然可以使用链接问题中接受的答案,该问题使用 public static Func<DateTime> Now = () => DateTime.Now;供应商。

关于c# - 使用 IClock 和 DI 时如何在实体中引用 DateTime.Now?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8417654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com