2013-08-03 3 views
1

Это основной вопрос MVVM.Оценка MVVM на модели

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

Вопросов:

  1. где должны методы возможных платежей будет храниться? Модель или модель обзора?

  2. если модель, когда пользователь меняет возраст, который должен скачать новый список способов оплаты?

Какую модель должна содержать и что делать в MVVM?

+0

Ну, кто решает, действительно ли выбран способ оплаты для конкретного учащегося или нет, сервер или сам студент? –

ответ

1

Ну, на мой взгляд, модель должна содержать список способов оплаты, в то время как виртуальная машина должна содержать список для привязки к представлению. Например, я бы сделал, чтобы иметь List<PaymentOptions> на модели и BindingList<PaymentOptions> или ObservableCollection<PaymentOptions> для виртуальной машины.

+0

Привет, я обновил вопрос, чтобы сделать способ оплаты динамичным – LostInComputer

+0

У вас все еще может быть список способов оплаты, и у этих способов оплаты есть свойство для возраста? Затем в виртуальной машине вы выбираете элементы из списка. Пример: Список _paymentMethods; BindingList _possiblemethods = _paymentMethods.Where (x => x.Age> minimum_age) –

2

Модель является логичным местом для размещения методов оплаты и бизнес-правил, связанных с каждым методом. Один из подходов состоит в том, чтобы использовать перечисление, описывающее каждый способ оплаты, и запрашивается с помощью операторов «switch».

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

public class Model 
{ 
    private readonly List<PaymentMethod> _allPaymentMethods; 
    public Model() 
    { 
     // get payment types from the db 
     // to populate master list 
     _allPaymentMethods = new List<PaymentMethod> {new Cash(), new CreditCard()}; 
    } 
    public List<PaymentMethod> GetPaymentMethods(int age) 
    { 
     List<PaymentMethod> result = 
      _allPaymentMethods.Where(q => q.Age == age).ToList(); 
     return result; 
    } 
} 
public abstract class PaymentMethod 
{ 
    public string Name { get; protected set; } 
    public int Age { get; protected set; } 
    public abstract void ProcessPayment(); 
    public override string ToString() 
    { 
     return Name; 
    } 
} 
public class CreditCard:PaymentMethod 
{ 
    public CreditCard() 
    { 
     Name = "Credit Card"; 
     Age = 25; 
    } 
    public override void ProcessPayment() 
    { 
     Console.WriteLine("Thanks for using your card"); 
    } 
} 
public class Cash:PaymentMethod 
{ 
    public Cash() 
    { 
     Name = "Cash"; 
     Age = 22; 
    } 
    public override void ProcessPayment() 
    { 
     Console.WriteLine("Thanks for paying cash"); 
    } 
} 

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

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

Фрагмент кода для VM выглядит ...

public class ViewModel :INotifyPropertyChanged 
{ 
    public ObservableCollection<PaymentMethod> Methods { get; set; } 
    public ViewModel() 
    { 
     Model m = new Model(); 
     Methods = new ObservableCollection<PaymentMethod>(m.GetPaymentMethods(22)); 
    } 
    #region INotifyPropertyChanged Implementation 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged(string name) 
    { 
     var handler = System.Threading.Interlocked.CompareExchange 
       (ref PropertyChanged, null, null); 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
    #endregion 
} 

Какой бы подход вы используете (либо перечисление или полиморфизм), эмпирическое правило является «Есть ли абсолютно необходимо знать об этом ВМ? Может Я использую сильные стороны наследования и полиморфизма ОО в своей архитектуре? "

+0

Эта модель также содержит свойства ученика или является студентом в своей собственной модели, которая также управляется виртуальной машиной? – LostInComputer

+0

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

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