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"
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".
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"
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.
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.
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.
- 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).
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".
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.
Comentarios
Publicar un comentario