Ol√° Amigos da Comunidade ASPNETi,

 

Meu nome é Fabio Aguiar, sou programador asp.net nas linguagens VB.NET e C# há 3 anos e este é o meu primeiro artigo técnico. Vai ser um desafio e tanto, mas tenho certeza que vai ser uma experiência muito boa para mim, e espero, pra vocês também. Quero dividir aqui, minha experiência em ASP.NET e mostrar também as novidades que estão surgindo nessa área.

 

Hoje vou falar sobre Design Patterns. Mas afinal, o que s√£o Design Patterns?

 

A defini√ß√£o cl√°ssica para Pattern √© a seguinte: "um Pattern descreve um problema que se repete v√°rias vezes em um determinado meio, e em seguida descreve o n√ļcleo da sua solu√ß√£o, de modo que esta solu√ß√£o possa ser usada milhares e milhares de vezes‚ÄĚ [Christopher Alexander].

 

Patterns s√£o solu√ß√Ķes gen√©ricas e reutiliz√°veis, aplic√°veis em classes de problemas bem conhecidos. Solu√ß√Ķes que um dia funcionaram, tornam-se receitas para situa√ß√Ķes similares (desde que estas solu√ß√Ķes tenham sido projetadas com flexibilidade).

 

Um Design Pattern pode ser usado em qualquer linguagem de programa√ß√£o, j√° que se trata de padr√Ķes de desenvolvimento, por isso, o que vou descrever aqui, √© o padr√£o que eu sigo. N√£o √© necess√°rio tamb√©m que se uso s√≥ um padr√£o, voc√™ pode usar v√°rios conceitos num mesmo sistema.

 

Meu padr√£o de c√≥digo se divide em tr√™s partes, VO (Value Object), BO (Business Object), e Model (modelo). Na teoria, VO‚Äôs s√£o usados para transportar dados entre as camadas BO e Model. Vamos ver como √© isso na pr√°tica: imagine que voc√™ tenha uma procedure para logar o usu√°rio no sistema, voc√™ manda o usu√°rio e a senha, e retorna todas as informa√ß√Ķes do usu√°rio caso o logon tenha sucesso, como voc√™ poderia fazer isso usando o conceito de Design Patterns?

 

Veja a seguir, primeiro a classe voUsuarios, que contém os valores:

Public Class voUsuarios

    Private _usuario As String

    Private _senha As String

    Private _nome As String

    Private _email As String

    Private _codigo As Integer

 

    Public Property Usuario() As String

        Get

            Return _usuario

        End Get

        Set(ByVal value As String)

            _usuario = value

        End Set

    End Property

 

    Public Property Senha() As String

        Get

            Return _senha

        End Get

        Set(ByVal value As String)

            _senha = value

        End Set

    End Property

 

    Public Property Nome() As String

        Get

            Return _nome

        End Get

        Set(ByVal value As String)

            _nome = value

        End Set

    End Property

 

    Public Property Email() As String

        Get

            Return _email

        End Get

        Set(ByVal value As String)

            _email = value

        End Set

    End Property

 

    Public Property Codigo() As Integer

        Get

            Return _codigo

        End Get

        Set(ByVal value As Integer)

            _codigo = value

        End Set

    End Property

End Class

 

 

Depois a classe modelUsu√°rios, que contem os parametros e o nome da procedure:

Imports System.Data

Imports System.Data.SqlClient

 

Public Class modelUsuarios

    Private mIList As IList

 

    'Nome da procedure

    Public ReadOnly Property ComandoAutenticar() As String

        Get

            Return "proc_AutenticaUser"

        End Get

    End Property

 

    'Parametros

    Public Function mountParamAutenticar(ByVal vUsuarios As voUsuarios) As IList

        Dim SQLparam As SqlParameter

        mIList = New Collection

        Try

            'Login

            SQLparam = New SqlParameter

            SQLparam.ParameterName = "@login"

            SQLparam.SqlDbType = SqlDbType.VarChar

            SQLparam.Value = vUsuarios.Usuario

            mIList.Add(SQLparam)

 

            'Senha

            SQLparam = New SqlParameter

            SQLparam.ParameterName = "@senha"

            SQLparam.SqlDbType = SqlDbType.VarChar

            SQLparam.Value = vUsuarios.Senha

            mIList.Add(SQLparam)

 

            Return mIList

        Catch ex As Exception

            Throw ex

        End Try

    End Function

 

End Class

 

Por fim, a classe boUsuarios, onde tudo acontece:

Imports System.Data

Imports System.Data.SqlClient

 

Public Class boUsuarios

    Private oSQL As SqlConnection

    Private oCmd As SqlCommand

    Private ds As DataSet

    Private DtAdp As SqlDataAdapter

 

    Public Sub Autenticar(ByVal vUsuarios As voUsuarios)

        Dim mUsuarios As New modelUsuarios

        oSQL = New SqlConnection(ConfigurationManager.ConnectionStrings(0).ConnectionString)

        oCmd = New SqlCommand(mUsuarios.ComandoAutenticar, oSQL)

 

        Try

            oSQL.Open()

            Dim mList As IList = mUsuarios.mountParamAutenticar(vUsuarios)

            For Each param As SqlParameter In mList

                oCmd.Parameters.Add(param)

            Next

            DtAdp = New SqlDataAdapter(oCmd)

            DtAdp.Fill(ds)

            Try

                If ds.Tables(0).Rows.Count <> 0 Then

                    Dim dr As DataRow = ds.Tables(0).Rows(0)

                    vUsuarios.Codigo = dr("usu_codigo")

                    vUsuarios.Nome = dr("usu_nome")

                    vUsuarios.Email = dr("usu_email")

                    vUsuarios.Usuario = dr("usu_usuario")

                Else

                    vUsuarios.Codigo = -1

                End If

            Catch ex As Exception

                Throw ex

            End Try

        Catch ex As Exception

            Throw ex

        Finally

            oSQL.Close()

            oCmd.Dispose()

            oCmd = Nothing

            oSQL = Nothing

            DtAdp.Dispose()

            DtAdp = Nothing

        End Try

    End Sub

 

End Class

 

Agora veja, como usamos:

Protected Sub btnLogin_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnLogin.Click

        Dim vUsuarios As New voUsuarios

        Dim bUsuarios As New boUsuarios

        Try

            vUsuarios.Usuario = tbUserName.Text

            vUsuarios.Senha = tbSenha.Text

 

            bUsuarios.Autenticar(vUsuarios)

            If vUsuarios.Codigo <> -1 Then

                Session("UserDados") = vUsuarios

                FormsAuthentication.RedirectFromLoginPage(tbUserName.Text, False)

            Else

                lbMSG.Text = "Nome de Usu√°rio ou Senha inv√°lida"

            End If

        Catch ex As Exception

            lbMSG.Text = "Erro: " & ex.Message

        Finally

            vUsuarios = Nothing

            bUsuarios = Nothing

        End Try

    End Sub

Note que salvei os dados do login no Session, você poderá utilizar esses dados em qualquer situação, bastando declarar como uma variável do tipo voUsuarios:

Dim vUsuarios As voUsuarios

vUsuarios = DirectCast(Session("UserDados"), voUsuarios)

 

If Not IsNothing(vUsuarios) Then

    lbCodigo.Text = vUsuarios.Codigo

    lbNome.Text = vUsuarios.Nome

End If

Este modelo assegura que somente a camada VO ter√° acesso aos dados, fazendo o papel do transporte. O desenvolvimento N-Tier, ou multi-camadas, √© recomendado para qualquer aplica√ß√£o, ou pelo menos eu penso assim. Minha recomenda√ß√£o √© que fa√ßa sempre uso de boas pr√°ticas de desenvolvimento, com certeza suas aplica√ß√Ķes ficar√£o mais limpas, seguras, mais f√°cil de fazer a manuten√ß√£o e a reutiliza√ß√£o do c√≥digo.

 

Espero que seja muito proveitoso para vocês.

 

Um abraço e até a próxima.