Ленивая инициализация свойства ViewModel - PullRequest
0 голосов
/ 13 июня 2018

Я разрабатываю приложение с контейнером IoC и композицией объектов из корневого каталога.Цель состоит в том, чтобы минимизировать время создания объекта, откладывая инициализацию свойств ViewModel.

Поскольку я совершенно новичок в мире IoC, мой первоначальный подход состоял в том, чтобы просто вызвать IRepository прямо вконструктор и заполнить свойство.Но это приводит к большому количеству вызовов во время компоновки объекта.

Я не хочу создавать метод Initialize, потому что вызов этого может быть забыт и приведет к недопустимому состоянию объекта.

Я думаю об использовании Lazy<> для отложенной инициализации следующим образом:

readonly Lazy<IEnumerable<Customer>> _lazyCustomers;
public virtual IEnumerable<Customer> Customers => _lazyCustomers.Value;

public ReportViewModel(IReportRepository repository)
{
    _lazyCustomers = new Lazy<IEnumerable<Customer>>(repository.GetCustomers);
}

Это выглядит многообещающе, но если у свойства есть установщик, я должен придумать дополнительнуюполе, потому что я не могу установить Lazy's Value:

<IEnumerable<Customer> _customers;
readonly Lazy<IEnumerable<Customer>> _lazyCustomers;
public virtual IEnumerable<Customer> Customers {
    get { return _customers ?? (_customers = _lazyCustomers.Value); }
    set { _customer = value; }
}

Этот взгляд выглядит слишком сложным с моей точки зрения.Я мог бы полностью избавиться от Lazy<> и напрямую вызвать IReportRepository в получателе свойства.

Что такое хороший шаблон для инициализации свойства (после создания объекта)?Это слишком сложно, и я должен придерживаться метода Initialize?

1 Ответ

0 голосов
/ 13 июня 2018

Проблема, с которой вы столкнулись, не имеет ничего общего с МОК.Вы не должны делать звонки как GetCustomers в своем конструкторе.

Если вы хотите кэшировать своих клиентов (это будет загружать клиентов из хранилища при первом вызове, а затем использовать приватную переменную), вы можете сделать что-то вроде:

    private IEnumerable<Customer> _customers;
    public IEnumerable<Customer> Customers {
        get { 
             if (_customers == null) 
             {
                _customers = _customerRepository.GetCustomers();
             }
             return _customers; 
        }
    }

   public AddCustomer(Customer customer) {
             if (_customers == null) 
             {
                _customers = _customerRepository.GetCustomers();
             }
             _cusomers.Add(customer);   
   }
...