Шаблон ViewModel и Singleton

у меня есть один ViewModel для обработки перечислений (несколько сущностей в Entity Framework).

1) философски, это хорошая практика использовать одноэлементный шаблон для этой ViewModel, потому что он широко распространен во всем приложении и используется во многих местах.

2) разве это не проблема для ViewModel (и связанных ObjectContext) жить очень долго?

спасибо!

5 ответов


этого, вероятно, следует разбить на два отдельных вопроса, но я возьму удар на обоих:

  1. нет. Нет причин, по которым ViewModel должен быть Синглтоном. На самом деле вам нужно несколько экземпляров (поскольку каждый будет отличаться), а не один экземпляр, который живет для запуска приложения. Просто потому, что объект широко распространен и часто используется, не делает его хорошим кандидатом на синглтон...это просто означает, что это хороший объект.

  2. ViewModels не должны иметь очень длинную жизнь (еще одна причина, по которой вы не хотите синглтон). В MVVM срок службы данной ViewModel будет до тех пор, пока пользователь откроет окно и завершит свои изменения.


наличие одноэлементной ViewModel полностью допустимо в определенных случаях. Одним из примеров, который я использовал несколько раз, является SettingsViewModel. Который должен быть доступен по всему миру несколькими системами в приложении. Моя модель настроек при создании загружает настройки из файла, ViewModel позволяет мне привязать, чтобы изменить эти настройки. Синглтон позволяет мне глобально получить доступ к тем настройкам, где мне нужно, а не передавать их в качестве параметров.

полностью действителен, в этом случай.


объекты живут только в стеке, пока сборщики мусора считают их необходимыми. Философски нет, это не хорошая идея использовать Singleton, поскольку он нарушает инкапсуляцию. См. статью: Singleton antipattern


Как упоминал Джастин, кажется маловероятным, что вам понадобятся ваши ViewModels, чтобы следовать шаблону Singleton. Однако, как вы упомянули, модели представления используются во всей системе. Рассмотрите возможность использования общих функций в базовых классах (если вам нравится наследование) и/или использования повторно используемых компонентов в объектах для использования композиции.

простой способ начать это все линии ViewModelBase Джоша Смита и типичное использование ViewModel INotifyPropertyChanged.

дать код вот посмотрите: http://mvvmfoundation.codeplex.com/


1) Не делай этого. см.MVVM ViewModels Singleton 2) я не думаю, что это хорошая идея иметь viewmodel, связанный с контекстом объекта. Это должна быть просто viewmodel, предоставляющая данные для представления; но не тесно связанная с какой-либо технологией сохранения данных. Вместо этого введите службы, которые заботятся об этом, чтобы вы могли издеваться над ними.