2016-07-14 6 views
1

Согласно MVVM, в моделях не должно быть логики. Давайте предположим, что есть модель лица, которая содержит два свойства:Согласно шаблону MVVM - кто несет ответственность?

public class Person { 
    public string Costcenter { get; private set; } 
    public User User { get; private set; } 
} 

Сам объект пользователя содержит другой объект, лицо, которое среди других свойств содержит свойство «Costcenter».

public class User { 
    public OtherPerson Person {get; private set; } 
} 

public class OtherPerson { 
    public string Costcenter {get; private set; } 
} 

OtherPerson это совершенно другой класс, чем Person

Сейчас мой актуальный вопрос: Кто будет нести ответственность за проверку, если Costcenter в Person равно Costcenter в OtherPerson?

Person.Costcenter == Person.User.OtherPerson.Costcenter 

Есть не так много возможностей:

  1. ViewModel отвечает
  2. Небольшие куски кода могут быть реализованы внутри модели
  3. Проверка может быть реализован как свойство геттерного

public ViewModel(){ 
    [...] 
    public bool IsCostcenterEqual(Person p){ 
     return p.Costcenter == p.User.OtherPerson.Costcenter; 
    } 
} 

public class Person { 
    public string Costcenter { get; private set; } 
    public User User { get; private set; } 
    public bool CostcenterEquals(){ 
     return this.Costcenter == this.User.OtherPerson.Costcenter; 
    } 
} 

public class Person { 
    public string Costcenter { get; private set; } 
    public User User { get; private set; } 
    public bool IsCostcenterEqualProperty{ 
     get{ 
      return this.Costcenter == this.User.OtherPerson.Costcenter; 
     } 
    } 
} 

На данный момент я не уверен, если это просто вопрос мнения, но я ищу лучший * способ решения этой проблемы

*) наилучший = лучший монтаж, связанный с шаблоном MVVM

Edit 1

Я забыл упомянуть, что я хотел бы использовать свои модели для EF (если это имеет значение)

+6

«Согласно MVVM, в моделях не должно быть логики». Кто вам сказал? Я бы сказал, что должна быть вся бизнес-логика. – Clemens

+3

Откуда у вас возникла мысль, что модель не должна содержать никакой логики? Весь уровень бизнес-логики находится в пределах модели. –

+1

Ahhh MVVM. Я думаю, что есть 7 разных мнений о том, что такое MVVM. Некоторые люди думают, что DTO - это модели (я не знаю). Некоторые думают, что ViewModel также является моделью (ну, что будет VVM). См. Это разумное обсуждение MVVM https://channel9.msdn.com/Shows/Visual-Studio-Toolbox/MVVM-Best-Practices –

ответ

-1

Как показывают другие ответы и комментарии, это тема, которая вызывает много страсти и мнения. Нет никакого «правильного» способа сделать это.

Вы можете принять позицию, согласно которой модель представляет собой всего лишь набор DTO/POCOs или что бы вы ни назвали. Затем ваши слои настойчивости и бизнес-логики живут внутри ViewModel.

Вы можете принять позицию, согласно которой модель представляет собой слой постоянства, отвечающий за сохранение только DTO и что бизнес-логика живет в ViewModel.

Вы можете принять позицию, что ViewModel несет ответственность только за обработку логики просмотра (поведение приложения), и что бизнес-логика и постоянство существуют в модели.

Вы можете занять позицию, которая ... и так далее. Вы можете применить подход к модели анемической модели данных; или подход с богатой моделью данных и т. д.

Нет ни одного правильного способа справиться с этим. Потеряны одинаково допустимые способы. Двумя ключевыми моментами для всех подходов являются:

  1. Решите подход и придерживайтесь его. Будьте единообразны во всем решении.
  2. Убедитесь, что слои правильно развязаны независимо от выбранного подхода.
+0

Хорошо, я вижу - это не черное и белое. Потому что это мора, основанная на мнениях, как уже упоминалось пару раз, я думаю, что ваш ответ подходит лучше :) Спасибо. – C4p741nZ

+1

Извините, но это не имеет смысла. Нет ничего о страсти и мнениях, а именно о применении шаблонов для улучшения поддерживаемого кода. Хотя ОП не четко определил слово «модель» в своем случае. ViewModels в MVVM всегда выполняют только логику представления (обработку пользовательского ввода, вызов доменных служб/бизнес-уровня). Если вы когда-либо ставите упорство и бизнес-уровень в ViewModel, он явно делает это неправильно, так как это нарушает первый принцип SOLID: принцип единой ответственности: у объекта должна быть только одна ответственность – Tseng

+0

@Tseng, вы имеете право на свое мнение. .. –

0

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

3

Думаю, у вас здесь больше уроков, чем вы думаете. Классы ViewModel выполняют аналогичную работу с контроллерами в MVC. У них не должно быть логики вашего бизнеса в них, но они должны координировать классы, которые делают, что является вашей логикой приложения.

Итак, у нас есть «Логика приложений», которая контролирует пользовательский интерфейс, связывает данные с представлением и выполняет интеграцию между тем, что делает пользователь/видит и «Бизнес-логика», которая реализует правила и инварианты вокруг него.

Если у них вообще не было логики, они были бы объектами передачи данных и мало полезны (DTO буквально предназначены для перемещения данных по известной «форме»).

Бизнес-логика обычно будет либо «Сценарии транзакций» (часто мы реализуем это как вещи, такие как IPersonService или IEmployeeService и т. Д., С методами, такими как IEmployeeService.HireNewEmployee(args]), или, если ваш домен достаточно сложный для этой части системы, Модель предметной области.

Какой бы путь вы идете, вы обнаружите, что эти классы, реализующие бизнес-логику будет вызываться по ViewModels.

+0

Вздох. Downvote без комментариев. Пожалуйста, дайте мне знать, что я могу сделать, чтобы улучшить ответ, если вы скажете, что это бесполезно. –

+0

Вероятно, люди, которые еще не понимали MVVM, SOLID и DDD. Imho это правильный ответ на вопрос – Tseng

-3

как правило, проверка выполняется на обоих ViewModels и моделей. ViewModels, как правило, учитывая логику, связанную с бизнесом, а валидация моделей используется исключительно для того, чтобы убедиться, что ее данные имеют смысл. Например, gender должно быть подтверждено на Person Модель. Это потому, что это факт, что пол может быть только male или female, независимо от того, что такое бизнес-логика.

0

Для этого конкретного сценария логику можно добавить в View Model.

Помните responsibilities-

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

View Model - любая логика, которая используется для выполнения манипуляций, чтобы показать соответствующие данные в UI.

Теперь, как этот движок должен выглядеть, какие манипуляции вам нужны для управления пользовательским интерфейсом, не влияет на его работу и связан только с пользовательским интерфейсом, поэтому эта логика и детали должны входите в View Model.

Смежные вопросы