Зачем реализовывать интерфейс в модели представления и представления в mvvm

Я новичок в шаблоне MVVM, поэтому, пожалуйста, потерпите меня. Я видел реализации в wpf + mvvm + prism, где все представления, как правило, имеют IView как самый верхний интерфейс. Затем представления в соответствующих модулях имеют интерфейс, специфичный для представления, такой как IViewA, IViewB и т. д., которые реализуют интерфейс IView. Даже модель представления имеет самый верхний интерфейс IViewModel, а последующие модули имеют IViewAViewModel, IViewBViewModel и т. д., которые наследуются от IViewmodel. IViewmodel имеет ссылку на Iview, а Iview имеет ссылку на IViewModel.

namespace xxx.xxx.infrastructure
{
public interface IView
{
  IViewModel ViewModel {get;set;}
}

public interface IViewModel 
{
  IView View {get;set;}
}

public abstract class ViewModelBase : IViewModel, INotifyPropertyChanged
{

   public IView View {get;set;}

   public ViewModelBase(IView view)
   {
     View = view;
     View.ViewModel = this;
   }
   //INotifyPropertyChanged left out
 }
}

namespace xxx.xxx.Modules.Customer
{
   public interface ICustomerDetailsView : IView
   {

   }

   public partial Class CustomerDetailsView : UserControl, ICustomerDetailsView 
   {
       public CustomerDetailsView ()
       {
         InitializeComponent();
       }

       //Is this implementation acceptable?The view is supposed to have zero code in       the code behind.....
        public IViewModel ViewModel
        {
          get
          {
            return (ICustomerDetailsViewViewModel)DataContext; 
          }
          set
          {
             DataContext = value;
          }
        }

    }  

    public interface ICustomerDetailsViewViewModel : IViewModel
    {
       string Message {get;set;}
    }

     public class CustomerDetailsViewViewModel : ViewModelBase,       ICustomerDetailsViewViewModel 
    {
      //Will be injected by unity as i have set up mappings in module initilize.
      public CustomerDetailsViewViewModel(ICustomerDetailsView view)
          :base(view)
      {
      }

       public string Message
       {
          //INotifyPropertyChanged left out for brevity
          get;set;
       }
   }

У меня есть несколько вопросов.

1. )Разве это не нарушение MVVM, поскольку предполагается, что код позади файла имеет нулевой код?

2. )в модели представления MVVM не должно беспокоить представление или его контракт? Не нарушает ли приведенная выше реализация его?

3. )Не могу понять, в чем польза от этой реализации. На самом деле это граничит с MVP, и требуется много кода.

4. )Если это приемлемый способ реализации, нужно ли мне иметь интерфейсы для всех представлений и моделей представлений во всех моих модулях?

7
задан Hari Subramaniam 13 July 2012 в 03:55
поделиться