2010-06-25 2 views
1

После долгого сдерживания с поддержанием отношений model-viewmodel (например, создание экземпляров vm для каждого экземпляра модели) У меня есть некоторые идеи, которые могут быть довольно противоречивыми, но я любопытных мнений.MVVM и неявный литой от модели к viewmodel

Что делать, если класс VM был создан для хранения статического списка контейнеров для экземпляров модели. Эти могут (или даже должны) быть слабыми ссылками, поэтому всякий раз, когда экземпляр класса модели выходит за пределы области видимости, его модель обзора автоматически удаляется. Другой вариант - повторное использование экземпляров vm.

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

Что вы думаете об этом? Является ли это трудным нарушением правил и шаблонов MVVM?

// edit Я должен, вероятно, также указать, в чем заключается причина: в моем приложении у меня есть несколько мест, где я использую один из моих классов моделей и нуждаюсь в соответствующих ссылках vm. В каждом таком месте мне нужно наблюдать коллекцию и реагировать на изменения - создание или удаление экземпляров vm. Это в основном тот же самый код, который повторяется во многих местах => Я думал о создании только одного места для этого (неявный бросок - это просто конфета, которую не требуется для решения реальной проблемы). Или, может быть, вместо статических списков я должен создать диспетчер, который будет обрабатывать создание экземпляра модели для всех моих классов?

+0

через несколько лет вы обнаружили некоторые недостатки? Было бы интересно увидеть код, который в основном дублируется, но я не думаю, что это так. – WiiMaxx

ответ

0

Прежде всего, я не уверен, нарушают ли ваши идеи шаблон MVVM. По-моему, в каждом случае это не так важно для полномасштабных образцов. Образец в моих глазах предлагает стратегии решения проблем. В большинстве случаев не стоит следовать шаблону 100% всеми способами. Если есть прагматичное решение, вы должны использовать его. Конечно, это должны быть решения, которые приводят вас к вашим целям, например. единицу проверяемого, разделение пользовательского интерфейса и прикладной логики и т. д.

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

Для меня ваша идея менеджера - лучший способ. Аналогичным образом я использую модели просмотра. Это зависит от того, сколько модели просмотра нужно создать, но вам лучше создать новые модели представлений, чем повторное использование существующих. Где-то я читал, что модели представлений должны представлять собой своего рода конечный автомат. Следуя этой идее, вы никогда не знаете, в каком состоянии выглядит модель просмотра, когда вы ее повторно используете. Таким образом, предпочтительным способом является создание новой модели представления.

Только некоторые мысли! Возможно, есть и другие идеи ...

+0

Спасибо за ваш ответ :) Кратко прокомментируйте это: я хотел услышать мнения о возможных недостатках такого подхода, и, таким образом, мой вопрос был, возможно, немного отстающим. Другое дело, что у меня нет модели, связанной с моделью взглядов. Неявный оператор литья может быть определен на обоих типах, которые являются частью приведения, поэтому в этом случае я определяю его в классе vm. Вы совершенно правы в том, что vm является конечным автоматом для просмотра, поэтому повторные экземпляры vm могут быть не лучшим решением. – kubal5003

+0

Мне действительно нужен один экземпляр vm для контекста, в котором он используется, поэтому это становится довольно сложным.Другим подходом может быть определение различных свойств/событий для разных контекстов, но это может привести к довольно беспорядку при условии, что мне нужны два очень похожих метода использования моего класса. Мне нужно будет подумать об этом подробнее .. Менеджер ViewModel теперь кажется лучшим вариантом, поскольку он дает большую гибкость и способности использовать дополнительную информацию (например, контекст) – kubal5003