公共静态DateTime字段是反模式还是良好做法



在我们的程序中,我们有所谓的WallclockDateTime。因为我们可以在时间上移动,所以这个WallclockDateTime与当前时间无关。但现在我的课上到处都需要这个WallclockDateTime

首先,我决定通过从构造函数到构造函数的引用传递这个WallclockDateTime。但这需要大量的维护。现在我有一个类Foo,它是在Collection<Foo>中大量创建的,通过构造函数一次又一次地传递相同的WallClockTime对我来说似乎有点无用。所以我想:这难道不能更高效吗?

首先,我尝试将中央WallclockDateTime设置为静态编辑:但我不允许在静态属性中使用OnPropertyChanged(),它来自我的解决方案之外。如果我将_wallclockDateTime公开并静态,我可以在任何地方使用它!但对我来说,这似乎很肮脏。那么,有什么好的解决方案呢?从构造函数传递到构造函数?还是将字段公开并保持静态?或者其他一些聪明的解决方案?

private DateTime _wallclockDateTime;
public DateTime WallclockDateTime
{
get
{
return _wallclockDateTime;
}
set
{
if (_wallclockDateTime != value)
{
_wallclockDateTime = value;
OnPropertyChanged(nameof(WallclockDateTime));
OnPropertyChanged(nameof(CurrentSliderStateLabel));
OnPropertyChanged(nameof(WallclockDateTimeTicks));
}
}
}
// This class is used in a Collection<Foo>
public class Foo
{
private static DateTime _wallClockTime;
public Foo(ref DateTime wallClockTime)
{
_wallClockTime = wallClockTime;
}
public void Bar()
{
// Do something with the _wallClockTime
}
}

通常的解决方案是使用依赖注入。您创建了一个服务提供商和一个支持您所有约会需求的服务。

Microsoft有一个依赖项注入系统Microsoft.Extensions.DependencyInjection.

您可以将服务放入其他服务的构造函数中,也可以直接访问它。

有一种观点认为,依赖注入只是拥有全局变量的一种奇特方式。另一方面,当与大型系统中每个服务的接口定义一起使用时,它可能确实提高了测试组件的能力。

另一个注释是,在大多数情况下,DateTimeOffset比DateTime更好,因为它消除了日期/时间相对于哪个时区的模糊性。

最新更新