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