Область просмотра моделей при использовании шаблона локатора службы в приложении WPF - PullRequest
1 голос
/ 21 августа 2009

При использовании класса Service Locator для обслуживания ViewModels для ваших страниц WPF для привязки. Должны ли ViewModels иметь синглтонную или заводскую область? Является ли вообще лучшая идея для приложений WPF ??

Мне известно, что в Silverlight Singleton лучше подходит для страниц, которые являются пользовательскими элементами управления и перемещаются только на передний план. Но вплоть до попытки применить этот шаблон я обновлял экземпляры страниц и их соответствующие виртуальные машины каждый раз, когда они должны быть загружены.

Я и мой коллега прошли через все плюсы и минусы для каждого варианта, и ничего не кричало, что является лучшим вариантом для нашего сценария.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 22 августа 2009

Я бы держался подальше от создания ваших синглтонов View Models. Если только они не являются представлениями, которые сохраняются в регионе в течение всего сеанса пользователя. Такие вещи, как навигация, меню и т. Д. Если вы используете что-то из Prism / Composite WPF, они используют Unity в качестве IoC или локатора служб (если так вы его используете), модели представления / презентации создаются, когда они представлены и оставлены для сбора мусора. когда закрыто. Это позволяет каждому экрану пройти свой жизненный цикл, как задумано.

Вы можете использовать такие вещи, как RegionManager (CompositeWPF) для хранения моделей просмотра в памяти, пока они не будут явно закрыты. Это позволит пользователям просматривать открытые представления, поддерживая их взаимодействие, если это является требованием. Когда пользователь решает сохранить / закрыть экран, он удаляется из RegionManager и затем удаляется сборщиком мусора.

Синглтоны - это шаблоны проектирования, используемые в очень специфических целях, т. Е. Вам нужен только один, и он понадобится только на время существования приложения. Если бы это не было требованием, я бы остался в стороне.

0 голосов
/ 27 февраля 2013

Хорошо, если я отступлю назад, чтобы подумать о том, что делает модель представления; Я назначаю ему модель, а затем у меня есть вид, использующий команды или свойства привязки.

Итак, каждый ViewModel является экземпляром, специфичным для модели.

Также методы ViewModel обычно работают с экземпляром текущей модели. Это означает, что методы не являются изолированными логическими единицами. т.е.

interface IService
{
    Foo Model;
    Result DoSomethingWithModel();
}

имеет логику, зависящую от его собственного состояния экземпляра.

тогда как это чисто логическая служба:

interface IService
{
    Result DoSomething(With me);
}

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

...