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

时间:2018-11-28 14:38:07

标签: c# design-patterns

在我们的程序中,我们称为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
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

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

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

另一条评论,在大多数情况下,DateTimeOffset优于DateTime,因为它消除了日期/时间相对于哪个时区的歧义。