C# -  Usando o padrão MVP - Model View Presenter


 Neste artigo vamos rever o padrão MVP e mostrar uma implementação prática deste padrão usando a linguagem C#.

Há muito tempo atrás eu publiquei um artigo sobre o MVP (aqui), e neste artigo voltamos ao assunto para complementar o artigo, desta vez usando a linguagem C#, recordando alguns conceitos e mostrando uma forma de implementar o padrão.

Para relembrar vejamos o que é o padrão MVP.

O padrão Model View Presenter (MVP) é um padrão arquitetural de interface do usuário projetado para facilitar os testes unitários e melhorar a separação de interesses na lógica de apresentação:

- O Model  - É uma interface que define os dados a serem exibidos ou usados na interface do usuário;
- A View  - É uma interface passiva que exibe dados (do modelo) e roteia os comandos do usuário (eventos) para o Presenter (apresentador) para agir sobre esses dados;
- O Presenter - Age sobre o Model e View. Ele recupera dados de repositórios (o modelo) e os formata para exibição na View;

Nota: O termo interface está sendo usado aqui em um sentido genérico; um ponto em que dois sistemas, se encontram e interagem.

Abaixo temos uma representação gráfica do padrão MVP :

Neste artigo iremos abordar o MVP seguindo o padrão Passive View que segue os seguintes fundamentos:

  • Estado é armazenado na View;
  • A lógica da interface do usuário é armazenada no Presenter;
  • A View é totalmente isolada do Model. O Presenter também assume a tarefa de sincronizar dados entre a View e o Model;
  • O Presenter esta ciente da View;
  • A View não conhece o Presenter;

Vamos agora ao exemplo prático.

Recursos usados:

  • Visual Studio 2017 Community

Criando o projeto ASP .NET (Web Forms)

Vamos usar um exemplo clássico bem simples de forma a facilitar o entendimento da aplicação do padrão.

Abra o VS 2017 e crie um projeto Web do tipo ASP .NET Web Application .NET Framework) chamado DemoMVP.

A seguir selecione o template Empty e marque Web Forms e clique em OK.

Vamos iniciar definindo a interface ICirculoModel que vai fazer parte do nosso Model:

    public interface ICirculoModel
    {
        double getArea(double raio);
    }

Na interface definimos a assinatura do método para calcular a área do círculo.

A seguir vamos criar uma classe CirculoModel que implementa essa interface e calcula o valor da área do circulo. Essa classe será o nosso Model.

using System;
namespace DemoMVP
{
    public class CirculoModel : ICirculoModel
    {
        public CirculoModel()
        { }
        public double getArea(double raio)
        {
           return Math.PI * raio * raio
        }
    }
}

Precisamos agora definir a nossa View que representa a interface com o usuário. Nossa interface será bem simples e vai apenas exibir uma caixa de texto para ser informado o raio, um botão de comando, e uma Label para exibir o resultado.

Assim vamos definir a interface IView com duas propriedades conforme abaixo:

        public interface IView
        {
              string txtRaio { get; set;}
              string txtArea { get; set;}
         }

Agora vamos incluir um WebForm no projeto chamado Index.aspx que será a nossa interface com o usuário.

No menu Project-> Add New Item escolha Web Form e informe o nome Index.aspx e clique em Add.

A seguir inclua o código abaixo neste web form:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="DemoMVP.Index" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>DemoMVP</title>
</head>
<body>
    <form id="form1" runat="server">
        <h2>Macoratti.net </h2>
        <hr />
        <div>
            <table>
                 <tr>
                   <th colspan="2">Calcular a Área do Círculo</th>
                 </tr>
                 <tr>
                   <td>Informe o raio</td>
                   <td><asp:TextBox ID="txtRaio" runat="server"></asp:TextBox></td>
                 </tr>
                 <tr>
                 <td>Resultado:</td>
                 <td><asp:Label ID="lblArea" runat="server" ForeColor="red"></asp:Label></td>
                 </tr>
                 <tr align="right">
                 <td colspan="2"><asp:Button ID="btnResultado" runat="server" Text="Valor da Área" 
OnClick="btnResultado_Click" /></td>
                 </tr>
             </table>
        </div>
    </form>
</body>
</html>

Agora precisamos criar nosso Presenter que vai coletar as informações que o usuário informar na View Index.aspx e passar para o Model.

Crie uma classe chamada CirculoPresenter com o código a seguir:

using System;
namespace DemoMVP
{
    public class CirculoPresenter
    {
        IView mview;
        public CirculoPresenter(IView view)
        {
            mview = view;
        }
        public double CalcularAreaCirculo()
        {
            CirculoModel model = new CirculoModel();

            mview.TxtArea = model.GetArea(double.Parse(mview.TxtRaio)).ToString();
            return Convert.ToDouble(mview.TxtArea);
        }
    }
}

No Presenter temos o método CalcularAreaCirculo() que cria uma instância do Model e usa o método GetArea() passando os valores a partir da View e retornando o valor da área.

Finalmente para realizar a comunicação com o Model via Presenter vamos definir o código abaixo no arquivo code-behind Index.aspx.cs :

using System;
namespace DemoMVP
{
    public partial class Index : System.Web.UI.Page , IView
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
        protected void btnResultado_Click(object sender, EventArgs e)
        {
            CirculoPresenter presenter = new CirculoPresenter(this);
            presenter.CalcularAreaCirculo();
        }
        public string TxtRaio
        {
            get { return txtRaio.Text; }
            set { txtRaio.Text = value; }
        }
        public string TxtArea
        {
            get { return lblArea.Text; }
            set { lblArea.Text = value; }
        }
    }
}

Neste código definimos as duas propriedades da View :  TxtRaio e TxtArea e a seguir no evento Click do botão de comando criamos uma instância do Presenter e calculamos a área.

Note que a nossa página Index.aspx herda de IView.

Executando o projeto iremos obter o seguinte resultado:

Então, agora deu para entender como funciona o MVP ?

Pegue o projeto completo aqui :  DemoMVP.zip

(disse Jesus)"Aquele que tem os meus mandamentos e os guarda esse é o que me ama; e aquele que me ama será amado de meu Pai, e eu o amarei, e me manifestarei a ele."
João 14:21

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti