2013-08-29 2 views
0

Я хочу понять, как реализовать шаблон MVP на .net, используя форму Windows. В будущем я хочу использовать созданный шаблон в Интернете.MVP pattern on .net

Моя проблема в том, что я не уверен, что я делаю это правильно.

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

public class ScorePresenter{ 
    private IScoreView _scoreView; 
    private IClientView _clientView;   

    public ScorePresenter() 
    { 
    } 

    public void AttachView(IScoreView view){ 
     this._scoreView = view; 
    } 

    public void AttachView(IClientView view){ 
     this._clientView = view; 
    } 

    public void Create(Model model){ 
     try{ 
      //create code here     

      this._clientView.Reload(); 
     } 
     catch(Exception ex){ 

     } 
    } 

} 

public class ClientPresenter(){ 
    private IClientView _clientView; 

    public ClientPresenter(){ 

    } 

    public void AttachView(IClientView view){ 
     this._clientView = view; 
    } 
} 


public interface IClientView{ 
    void Reload(); 
} 

public interface IScoreView{ 

} 

использование

форма клиент vb.net

Public Class ClientForm 
    Implements IClientView 

    Private _clientPresenter As ClientPresenter 

    Public Sub ClientForm_Load() Handles Me.Load 
     Me._clientPresenter = new ClientPresenter() 
     Me._clientPresenter.AttachView(Me) 
    End Sub 

    Public Sub Reload Implements IClientView.Reload 
      Reload code here 
    End Sub 

    Public Sub ScoreButton_Click() Handles ScoreButton.Click 
      Dim frmScoreForm as New ScoreForm 
      frmScoreForm.MyParent = Me 
      frmScoreForm.ShowDialog() 
    End Sub 

End Class 

оценка формы vb.net

Public Class ScoreForm 
    Implements IScoreView 

    Private _scorePresenter As ScorePresenter 

    Public Sub ScoreForm_Load() Handles Me.Load 
      Me._scorePresenter = new ScorePresenter() 

      Me._scorePresenter.AttachView(Me) 
      Me._scorePresenter.AttachView(Me._myParent) 
    End Class 

    Private _myParent as Object 
    Public WriteOnly Property MyParent As Object 
      Set(value As Object) 
       Me._myParent = value 
      End Set 
    End Property 

End Class 

на этот код клиента форме является основной формой, если я нажал счет на форме клиента будет отображена оценка

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

, что я вижу в этом, в том, что я не могу использовать ScorePresenter в одиночку право ? Это плохой дизайн? если да, то есть другой способ достичь того, что я хочу?

ответ

2

Если я правильно понимаю вашу проблему, вы хотите сообщить представления в том смысле, что изменения в одном из них должны обновлять другие.

Если это так, ваш подход неправильный.

Во-первых, ваш ведущий не должен управлять обоими представлениями. Разумным правилом в mvp является наличие ведущего для каждого представления, так что у вас есть соответствие 1-1 между представлениями и докладчиками.

Затем связь между ведущими осуществляется с помощью обмена сообщениями, например, с помощью агрегатора событий . Ведущие подписываются на события, а другие ведущие публикуют события. Таким образом, ваши ведущие полностью отделены друг от друга, вместо этого они связаны только с вызывающим движком. А публикации - подписки позволяют создавать неявные зависимостей.

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

В вашем конкретном случае, вы должны

  • ввести другую ведущие, в ClientPresenter
  • узнать существующие или создать пользовательскую реализацию агрегатора событий
  • ввести aggreegator события в обеих ведущих
  • создавать классы событий и подписываться на подписку в ведущих компаниях
  • поднять события, когда это необходимо, в одном из ваших докладчиков
+0

Event Aggregator - это новое для меня. Я посмотрел пример в Интернете, и я нашел это. http://www.codeproject.com/Articles/355473/Prism-EventAggregator-Sample – valrecx

+0

http://www.ronaldwidha.net/2010/05/31/a-simple-example-of-the-webformsmvp-cross- presenter-messaging/ – valrecx

+0

Существует также один в Prism. –

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