O que é uma boa maneira de implementar eventos em Passive View?
-
18-09-2019 - |
Pergunta
Estou aprendendo o padrão Passive View para manter meu aplicativo C # WinForms mais fácil de testar e manter.
Tem funcionado bem até agora, mas gostaria de saber se existe uma maneira melhor para implementar Eventos do que a maneira que eu estou fazendo isso agora (e mantê-los testável). Isto é o que parece (código omitindo não é relevante para este exemplo). basicamente o que Eu estou procurando, se é que há uma maneira de ignorar ligar eventos tanto no apresentador e na forma, eu preferiria fazer todo o trabalho em que o apresentador.
As minhas view parece com isso:
public interface IApplicationView
{
event EventHandler Find;
}
As minhas apresentador esta aparência:
public class ApplicationPresenter
{
private IApplicationView _view;
private IApplicationDomain _domain;
public ApplicationPresenter(IApplicationView view) : this(view, new ApplicationDomain()) {}
public ApplicationPresenter(IApplicationView view, IApplicationDomain domain) {
_view = view;
_domain = domain;
HookupEventHandlersTo(view);
}
private void HookupEventHandlersTo(IApplicationView view)
{
view.Find += delegate { FindAction(); };
}
public void FindAction()
{
// ...
}
}
O meu WinForm se parece com:
public partial class Form1 : Form, IApplicationView
{
private ApplicationPresenter _presenter;
public event EventHandler Find = delegate {};
public Form1()
{
InitializeComponent();
_presenter = new ApplicationPresenter(this);
HookupEvents();
}
private void HookupEvents()
{
searchButton.Click += Find;
}
}
Obrigado!
Solução
Outro ótimo recurso para aprender MVP com WinForms é Jeremy Millers Construa sua própria série CAB . Achei isso extremamente útil quando eu estava aprendendo,
O artigo sobre Ver para Presenter Comunicação será útil para você; há uma boa discussão aqui sobre o uso de eventos vs fazer chamadas diretas. Mesmo melhor, o agregador Evento artigo apresenta um 'mecanismo de publicação / assinatura' que pode ser usado em vez de eventos, mantendo o testável código. Esta é a abordagem que eu, pessoalmente, prefiro, e tiveram um bom sucesso com.
Outras dicas
Confira neste exemplo de como implementar a exibição passiva. Ele tem uma boa maneira de fiação / unwiring para eventos entre a visão eo controlador que coloca a maioria do trabalho no controlador.