Правильный способ ввести зависимость через свойство - PullRequest
0 голосов
/ 25 октября 2019

Я писал некоторый код, и мне сказали, что в нем есть потенциальная ошибка. Наш архитектор объяснил почему, но я до сих пор не вижу этого. Мне кажется, что он делает ту же работу даже после его исправления. Кто-нибудь может объяснить мне, что было изначально неправильно?

Как это должно выглядеть в соответствии с нашим архитектором:

    private IIzuProxyService _izuProxyService = null;

    private IIzuProxyService IzuProxyService
    {
        get
        {
            if (_izuProxyService == null)
                _izuProxyService = new IzuProxyService();
            return _izuProxyService;
        }
    }

Как это выглядело изначально:

    private IIzuProxyService _izuProxyService = null;

    private IIzuProxyService IzuProxyService
    {
        get
        {
            if (_izuProxyService == null)
                return new IzuProxyService();
            return _izuProxyService;
        }
    }

Спасибомного!

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

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

Обходным путем может быть использование Lazy<T> для управления отложенной загрузкой нужного поля.

Обеспечивает поддержку отложенной инициализации.

private Lazy<IIzuProxyService> _izuProxyService = new Lazy<IIzuProxyService>(() => new IzuProxyService() );

private IIzuProxyService IzuProxyService {
    get {
        return _izuProxyService.Value;
    }
}

Lazy<T> заменяет

if (_izuProxyService == null)
    _izuProxyService = new IzuProxyService();
return _izuProxyService;
0 голосов
/ 25 октября 2019

Ваш код никогда не присваивается полю _izuProxyService.

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

...