Tutorial: Sistema de login y registro de usuarios (Parte 2)

En la Entrada anterior desarrollamos gran parte del sitema, pueden ver la entrada aquí:

En la parte 2 desarrollaremos la capa Info, Data y Business del sistema. Recuerda que el código fuente descargable se encuentra al final del tutorial.

Capa Info

Esta capa representa las tablas de la base de datos como clases. objetos y propiedades dentro de visual basic.

Tabla = Clase
Campo = Propiedad

Crear la clase "UsuarioInfo.vb"
capa info

y agregar las siguientes propiedades.


Public Class UsuarioInfo
    Public Property UserId As Integer
    Public Property UserName As String
    Public Property Contrasenia As String
    Public Property Estado As String
End Class


Capa de Acceso a Datos

Se debe realizar referencia de la capa Info.

Crear la clase "UsuarioData.vb".
capa data


Ubicar el proyecto de acceso a datos de nombre "RestorantSystem.Seguridad.Data" y agregar un nuevo item de tipo ADO.NET Entity Data Model y nombrarlo "ModelSeguridad.edmx"
add new ado.net entity

Esta acción abrirá un wizard para establecer la conexión a la base de datos.
En la pantalla Choose Model Contents, seleccionar Generate from database.
choose model contents

En la pantalla Choose your data conection, dar click al botón "New Connection..." o seleccionar si ya tienes una conexión creada, dar nombre al connection string "EntitiesRestorant" y click en Next.
choose data connection


Para crear una nueva conexión se llenan los campos de la ventana Connection Properties, proporcionando un Server Name, credenciales y seleccionando una base de datos. Click en Test Connection para verificar que los datos ingresados están correctos.

configure connection to db


 En la ventana Choose your database objects and settings, seleccionar la tabla Usuario que creamos previamente en la parte 1, nombrar el model namespace como "ModelRestorant", click en finish.
choose tables

 Si realizaste correctamente los pasos indicados, se mostrará la siguiente ventana en visual studio.
model view

En la clase "UsuarioData.vb" se crean funciones para el acceso a la base de datos tales como:

  • IsValidCredential: Función booleana para comprobar el usuario y contraseña válidos. Se usa Linq to Entities para la consulta.
  • Insert: Método para insertar un nuevo usuario a la tabla de la base de datos.
  • ChangePassword: Método para actualizar el campo contraseña de un usuario existente en la tabla de la base de datos. Aquí se usa una funcion de predicado para obtener el registro (Linq o predicate functions son buenas, elige la que mas te agrade).
  • IsUserInDB: Función booleana para comprobar que un usuario existe o no en la base de datos. Aquí se usa predicate functions. (A veces resulta en menos lineas).

Código fuente de la clase UsuarioData.

Imports RestorantSystem.Seguridad.Info
Public Class UsuarioData
    Public Function IsValidCredential(userName As String, password As String) As Boolean
        Try
            Using Modelo As New EntitiesSeguridad()
                'Querying using Linq to Entities
                Dim q As IQueryable(Of Usuario) = From u In Modelo.Usuarios
                                                    Where u.UserName = userName _
                                                    And u.Contrasenia = password
                                                    Select u

                If q.Count() = 0 Then
                    Return False
                Else
                    Return True
                End If
            End Using
        Catch ex As Exception
            Return False
        End Try
    End Function

    Public Sub Insert(newUser As UsuarioInfo)
        Try
            Using Modelo As New EntitiesSeguridad()
                'Inserting new record into DB
                Modelo.Usuarios.Add(New Usuario With
                                    {
                                        .UserName = newUser.UserName,
                                        .Contrasenia = newUser.Contrasenia,
                                        .Estado = newUser.Estado
                                    })
                Modelo.SaveChanges()
            End Using
        Catch ex As Exception
            Return
        End Try
    End Sub

    Public Sub ChangePassword(editedUser As UsuarioInfo)
        Try
            Using Modelo As New EntitiesSeguridad()
                'Querying using predicate functions
                Dim userDB As Usuario = Modelo.Usuarios.First(Function(x) x.UserName = editedUser.UserName)
                userDB.Contrasenia = editedUser.Contrasenia
                Modelo.SaveChanges()
            End Using
        Catch ex As Exception
            Return
        End Try
    End Sub

    Public Function isUserInDB(userName As String)
        Try
            Using Modelo As New EntitiesSeguridad()
                'Querying using predicate functions
                Dim qty As Integer = Modelo.Usuarios.Count(Function(x) x.UserName = userName)

                If qty = 0 Then
                    Return False
                Else
                    Return True
                End If
            End Using
        Catch ex As Exception
            Return True
        End Try
    End Function
End Class


Capa Business

Se debe realizar referencias de la capa Data e Info.

Esta capa es la intermediaria entre la capa de interfaz de usuario y la capa de acceso a datos, puede contener lógica de negocio (de allí su nombre en inglés).


Clase "SystemParameters.vb"

Generalmente en sistemas medianos y grandes se tiene esta clase para almacenar cierta información global de la aplicación como quién está usando la aplicación, en qué computadora, que IP de red, etc. Por ahora solo agregamos una propiedad para saber quién es el usuario logoneado.



Imports RestorantSystem.Seguridad.Info
Imports System.Net

Public NotInheritable Class SystemParameters
    Public UserLogedIn As UsuarioInfo
    
    Private Shared _instance As SystemParameters
    Public Shared ReadOnly Property Instance() As SystemParameters
        Get
            If _instance Is Nothing Then
                _instance = New SystemParameters()
            End If
            Return _instance
        End Get
    End Property
End Class

PD: La porpiedad Shared _instance y SharedReadOnly Intance, sirven para no tener que instanciar la clase, de manera que sea facil el acceso a cada propiedad de la clase utilizando el formato "SystemParameters.Instance.UserLogedIn".

Clase "UsuarioBus.vb"

Esta clase contiene las llamadas a los métodos y funciones de la capa Data, aplicando lógica de negocio en el llamado.
Por ejemplo, aquí se puede incluir validaciones en cascada, calculos, etc.

Método Insert: Primero mediante la función booleana "isUserInDB" se valida si el usuario que se pretende ingresar a la DB ya existe en la tabla, si no, entonces se invoca al método "Insert".


Imports RestorantSystem.Seguridad.Data
Imports RestorantSystem.Seguridad.Info

Public Class UsuarioBus
    Private userData As New UsuarioData()
    Public Function IsValidCredential(userName As String, password As String) As Boolean
        Dim isCorrect As Boolean = userData.IsValidCredential(userName, password)
        Return isCorrect
    End Function

    Public Sub ChangePassword(editedUser As UsuarioInfo)
        userData.ChangePassword(editedUser)
    End Sub

    Public Sub Insert(newUser As UsuarioInfo, ByRef Message As String)
        If Not userData.isUserInDB(newUser.UserName) Then
            userData.Insert(newUser)
            Message = "Registro guardado con éxito."
        Else
            Message = "Nombre de Usuario ya existe en la Base de Datos."
        End If
    End Sub
End Class

PD: El parámetro por referencia "Message" del método Insert, sirve para rertornar mensajes al front-end, de manera que ante algún error el usuario sepa qué sucedió y qué hacer.


Continua en Parte 3 (Final)

Comentarios