在我们的程序中,我们有所谓的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更好,因为它消除了日期/时间相对于哪个时区的模糊性。