Я разрабатываю приложение с контейнером 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
?