title: MVP: Is it the View or the Presenter that should know of the Model?
body: <p>Relatively new to patterns, let me straight away show an example in the context of WinForms.</p>
  
  <p>I have a basic MVP Passive View structure, which one should I go ahead with:</p>
  
  <pre><code>public partial class UserView : Form, IUserView
  {
      public event EventHandler Save;
  
      public UserView()
      {
          InitializeComponent();
  
          new UserPresenter(new UserModel(), this);
      }
  }
  
  public class UserPresenter
  {
      public UserPresenter(IUser model, IUserView view)
      {
          view.Save += (sender, e) =&gt; model.Save();
      }
  }
  </code></pre>
  
  <p>or</p>
  
  <pre><code>public partial class UserView : Form, IUserView
  {
      public event EventHandler Save;
  
      public UserView()
      {
          InitializeComponent();
  
          new UserPresenter(this);
      }
  }
  
  public class UserPresenter
  {
      public UserPresenter(IUserView view)
      {
          var model = new UserModel();
          //assuming I have the logic to bind property values from View to Model
          view.Save += (sender, e) =&gt; model.Save();
      }
  }
  </code></pre>
  
  <p>My questions are:</p>
  
  <p>1) Who should know of the concrete instance of model <code>User</code>, View or Presenter?</p>
  
  <p>2) What will be the benefit in that case?</p>
  
  <p>3) Suppose my Model is never dependent on the View. In that case what's wrong if View knows Model? After all <code>UserView</code> is made to present <code>UserModel</code> isn't it?</p>
  
  <p>4) If Presenter should interact with only interfaces of Model and View, then to call <code>model.Save</code> in <code>Save</code> eventhandler, where do I get the concrete instance of <code>Model</code> from?</p>
  
  <p>There are two duplicate questions <a href="https://stackoverflow.com/questions/13352704/model-view-presenter-passive-view-who-loads-the-model">here</a> and <a href="https://stackoverflow.com/questions/13015999/mvp-view-knows-model">here</a>, but they aren't exactly dealing with my scenario I guess..</p>