Насколько я понимаю, SimpleIoc использует метод GetInstance для получения экземпляра зарегистрированного класса. Если экземпляр не существует, он создаст его. Однако этот экземпляр кэшируется и всегда извлекается, что имитирует одноэлементный шаблон.
Я считаю, что нет необходимости хранить экземпляр ViewModel в памяти, если есть небольшая вероятность того, что эта ViewModel понадобится дважды, поэтому я хотел бы создавать новый ее экземпляр каждый раз, когда это необходимо. Если у нас есть фабрика для ViewModels, у нас будет такое свойство:
public MyViewMOdel MyViewModel
{
get { return SimpleIoc.Default.GetInstance<MyViewModel>(); }
}
здесь используется одноэлементный шаблон, который, я думаю, не является лучшей практикой во всех случаях. Чтобы обойти эту проблему, я делаю следующее:
public MyViewModel MyViewModel
{
get { return new MyViewModel(SimpleIoc.Default.GetInstance<ISomeInterface>()); }
}
У этого есть недостаток: если я когда-нибудь изменю конструктор для MyViewModel, мне также нужно будет обновить это свойство. Ничего страшного, но все же есть какая-то зависимость.
Как вы справляетесь с этим сценарием и что-то мне не хватает? и почему было решено не возвращать необщий экземпляр.
И еще один вопрос: в сеансе глубокого погружения MVVM Лоран использует метод GetInstance сразу после регистрации конкретной ViewModel, чтобы, по его словам, гарантировать, что в контейнере уже есть экземпляр этой ViewModel.Почему именно это необходимо? Если вы получаете ViewModel через ViewModelLocator, вы создадите его всякий раз, когда потребуется. Так зачем мне создавать их заранее?