Является ли публичное статическое поле DateTime анти-паттерном или хорошей практикой? - PullRequest
0 голосов
/ 28 ноября 2018

В нашей программе у нас есть так называемое 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 голосов
/ 28 ноября 2018

Обычным решением является использование Dependency Injection.Вы создаете поставщика услуг и службу, которая поддерживает все ваши потребности в дате.

У Microsoft есть система внедрения зависимостей Microsoft.Extensions.DependencyInjection.

Вы можете либо поместить сервис в конструкторы других сервисов, либо просто получить к нему прямой доступ.

Существует мнение, что внедрение зависимостей - это просто модный способ иметь глобальные переменные.С другой стороны, при использовании с определениями интерфейсов для каждой службы в большой системе это, вероятно, улучшает возможности тестирования компонентов.

Еще один комментарий, в большинстве случаев DateTimeOffset лучше, чем DateTime, потому что он устраняет неоднозначность того, к какому часовому поясу относится дата / время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...