1

Доброго времени суток.

Как и во многих случаях, при использовании паттерна MVVM часть VM просто дублирует Model. Дублирование происходит процентов на 90. Я хотел бы временно избавиться от полного дублирования, но и чтобы связь VM и M оставалась такой же обособленной. введите сюда описание изображения

Сверху то, как есть сейчас. При обновлении Model(не со стороны VM) вызывается событие обновление модели, по которому VM сообщает что стоит обновить во View(кажется называется DomainEvent)

Но происходит куча дублирования свойств(и логики Model, что важнее и проблемнее).

Решение:

Унаследовать Model и переопределить обновляемые свойства.

В итоге вся логика Model будет записана в base. Мне же надо просто вызвать OnModelCreated();

Переопределяемому свойства я могу задать с помощью атрибутов имя во View(для связи) или в передаче методу OnModelCreated();

Вопроc: чем чревато подобная логика для приложения, которому может сильно разростись? Таким образом все круто: View не знает ничего об M, VM знает все об M, M ничего не знает об VM.

Вопрос 2: насколько это соотвествует паттерну?(все условности, что паттерн не догма я понимаю)

UPD 2:

Примерное описание работы программы в Update 2 вопроса: Синхронизация Model и ViewModel, когда приложение - Client

Arantler
  • 968
  • 2
    Если у вас M дублирует VM, нужна ли вам вообще M? https://ru.stackoverflow.com/a/379331/10105 Существование M — не догма. – VladD Nov 22 '17 at 10:16
  • @VladD да, я читал этот ответ и часто к нему обращаюсь. Дело в том, что правда нужна. Как я писал VM частично дублирует M, но я уверен, что в ближайшее время дублирование будет только этих сущностей(и это будет 50% VM). Программа точно станет большой и зная это, не хочется переписывать.

    То, что я описал в вопросе(пример решения) - это пример лайфхака - "Как упростить себе жизнь сейчас, но сильно не усложнять ее в будущем". Если VM сущность будет сильно отличаться, то мне просто нужно будет убрать наследование.

    – Arantler Nov 22 '17 at 10:35
  • Обычно делают не наследование, а реализуют Façade. – Bulson Nov 22 '17 at 11:33
  • @Bulson да, я знаю. Так и сделал. Но слишком много получается дублировать приходится(типы же тоже разные и там и там).

    В итоге логика, написанная в Model, должна быть переписана в VM под другие типы(под типы в VM).

    Реализация одного интерфейса - практически сработает, но с точки зрения MVVM ложится не очень(все же Model знает об интерфейса VM).

    – Arantler Nov 22 '17 at 11:36
  • 1
    Вам правильно заметил VladD, что можно обойтись совсем от слоя M. Хочу лишь со своей стороны добавить, что слой M в принципе, на мой взгляд, нужен когда модель пишется, тестируется отдельно от приложения с UI. Т.е. изначально предполагается, что под одну написанную модель будет реализован разного вида и функционала UI, допустим, вэб сайт и клиентские приложения WPF, для мобилки, и т.п. – Bulson Nov 22 '17 at 11:45
  • @Bulson у меня именно такая ситуация. Эта Model будет использовать в нескольких вариантах\слоях\приложениях. И да, эта Model работает на 3 приложениях уже(это 3). Эти 3 приложения - Серверы, имеют слой Model, через который и синхронизируются(не полностью). Этот слой есть во всех 3 приложениях – Arantler Nov 22 '17 at 12:02
  • @Bulson тут хорошо ложиться Facade, но пользу будет приносить в будущем. Сейчас нужно проще. По сути мне нужно использовать Model, чтобы View думал, что работает с View Model, но при этом жутко не дублировать Model во View Model – Arantler Nov 22 '17 at 12:06
  • @Arantler: Если вам нужна модель, но к ней нужна и VM, и они практически одинаковы — почему бы тогда не сделать кодогенерацию? – VladD Nov 22 '17 at 13:06
  • 1
    @Arantler: Вот тут пример кодогенерации: https://ru.stackoverflow.com/a/739879/10105 – VladD Nov 22 '17 at 13:14
  • @VladD да, это решение мне подойдет, спасибо. – Arantler Nov 23 '17 at 14:58
  • @Arantler: Практический совет по кодогенерации: генерируйте всегда partial-классы, чтобы можно было руками «впилить» недостающую функциональность. – VladD Nov 23 '17 at 15:01
  • @VladD спасибо, учту. – Arantler Nov 24 '17 at 07:24

0 Answers0