Blazor - CRUD com ADO.NET em camadas - I


  Hoje vamos iniciar a criação de um projeto em camadas que realizar o CRUD usando como cliente uma aplicação Blazor Server App.

Embora o EF Core seja uma ferramenta ORM consolidada e de bom desempenho por incluir uma camada de abstração na aplicação a ADO .NET possui um desempenho melhor quando usada da forma correta.

Assim, podemos ter um projeto cujo o desempenho seja crítico e assim teremos que usar a solução que oferece a melhor solução e que atenda este requisito.

Pensando neste cenário este artigo vai mostrar como realizar o CRUD básico para gerenciar informações de clientes usando uma aplicação Blazor usando a ADO.NET. Para isso vamos criar um projeto monolítico usando camadas de forma a termos a separação das responsabilidades e facilitar a manutenção e o escalanomento do projeto.

Neste projeto vamos usar o SQL Server onde temos um banco de dados CadastroDB e a tabela Clientes com a seguinte estrutura:

Que pode ser criada usando o seguinte script SQL :

CREATE TABLE [dbo].[Clientes](
[ClienteId] [int]
IDENTITY(1,1) NOT NULL,
[Nome] [nvarchar]
(100) NOT NULL,
[Email] [nvarchar]
(150) NOT NULL,
[Nascimento] [datetime]
NOT NULL,
[Telefone] [nvarchar]
(50) NOT NULL,
[Sexo] [nvarchar]
(20) NOT NULL,
[Renda] [decimal]
(12, 2) NOT NULL,
CONSTRAINT [PK_Clientes] PRIMARY KEY CLUSTERED
(
 
[ClienteId] ASC
));

A seguir vamos criar stored procedures no banco de dados SQL Server para realizar as operações CRUD. Vamos criar as seguintes stored procedures:

1- sp_AddCliente

USE [CadastroDB]
GO
Create procedure sp_AddCliente
(  
   @Nome NVARCHAR(100),    
   @Email NVARCHAR(150),   
   @Nascimento DATETIME,   
   @Telefone NVARCHAR(50),
   @Sexo NVARCHAR(20), 
   @Renda DECIMAL(12,2) 
)   
as    
Begin    
    Insert into Clientes (Nome,Email, Nascimento,Telefone,Sexo, Renda)    
    Values (@Nome,@Email, @Nascimento,@Telefone,@Sexo, @Renda)    
End

2- sp_DeleteCliente

USE [CadastroDB]
GO
Create procedure sp_DeleteCliente
(     
   @ClienteId int     
)     
as      
begin     
   Delete from Clientes where ClienteId=@ClienteId     
End

3- sp_GetCliente

USE [CadastroDB]
GO
Create procedure sp_GetCliente
(    
    @ClienteId int
)    
as     
Begin     
    SELECT * FROM Clientes WHERE ClienteId= @ClienteId
End

4- sp_GetClientes

USE [CadastroDB]
GO
Create procedure sp_GetClientes   
as   
Begin   
    select
          ClienteId,
          Nome,
          Email,
          Nascimento,   
          Telefone,
          Sexo,
          Renda
    from Clientes   
End

5- sp_UpdateCliente

USE [CadastroDB]
GO
Create procedure sp_UpdateCliente
(     
   @ClienteId INTEGER ,   
   @Nome NVARCHAR(100),    
   @Email NVARCHAR(150),   
   @Nascimento DATETIME,   
   @Telefone NVARCHAR(50),
   @Sexo NVARCHAR(20), 
   @Renda DECIMAL(12,2)
)     
as     
begin     
   Update Clientes      
   set Nome=@Nome,     
   Email=@Email,     
   Nascimento=@Nascimento,   
   Telefone=@Telefone,
   Sexo = @Sexo
   where ClienteId=@ClienteId     
End

Iremos usar estas stored procedures quando criamos a nossa camada de acesso aos dados com ADO .NET.

Aqui podemos citar as seguintes vantagens em usar stored procedures:

Temos também as seguintes desvantagens:

Vamos criar uma solução no VS 2022 Community e chamada blzCrud_Adonet que vai conter os seguintes projetos :

  1. BlzCrud.App  - Projeto Blazor Server que é a camada de apresentação usando componentes Razor;
  2. BlzCrud.application  - Projeto Class Library contém os serviços;
  3. BlzCrud.Domain - Projeto Class Library que contém as entidades do domínio;
  4. BlzCrud.Infra - Projeto Class Library que contém a lógica da camada de acesso aos dados;

Recursos usados:

Criando a solução e os projetos

Abra o VS 2022 e crie uma solução em branco chamada BlzCrud_Adonet usando o template Blank Solution.

A seguir menu File selecione Add->New Project e usando o template Blazor Server App:

Informe o nome BlzCrud.App e a seguir selecione as configurações conforme abaixo:

A seguir inclua os seguintes projetos usando a opção File -> Add-> New Project usando o template Class Library:

Definindo o relacionamento entre o projetos

Agora vamos definir o relacionamento entre os projetos da nossa solução da seguinte maneira:

  1. O projeto BlzCrud.App vai ter um relacionamento com o projeto BlzCrud.Application
  2. O projeto BlzCrud.Application vai ter um relacionamento com o projeto BlzCrud.Domain e BlzCrud.Infra
  3. O projeto BlzCrud.Domain não vai ter nenhum relacionamento
  4. O Projeto BlzCrud.Infra vai ter um relacionamento com o projeto BlzCrud.Domain

Para definir os relacionamentos sobre o projeto e a seguir selecione Add-> Project Reference e a seguir marque o projeto na janela Reference Manager:

Definindo o projeto Domain

No projeto Domain vamos criar as pastas Entities e Interfaces.

Na pasta Entities vamos criar a classe Cliente com a seguinte estrutura:

public class Cliente
{
    public int ClienteId { get; set; }
    [Required]
    public string? Nome { get; set; }
    [Required]
    public string? Email { get; set; }
    [Required]
    [DataType(DataType.Date)]
    public DateTime Nascimento { get; set; }
    [Required]
    public string? Telefone { get; set; }
    [Required]
    public string? Sexo { get; set; }
    [Required]
    public decimal Renda { get; set; }
}

Podemos melhorar esta implementação criando um Model para desvincular o domínio mas para simplificar estamos definindo os atributos Data Annotations para validação.

Na pasta Interfaces vamos criar duas interfaces

1- IClienteService

public interface IClienteService
{
    List<Cliente> GetClientes();
    void CreateCliente(Cliente cliente);
    void UpdateCliente(Cliente cliente);
    Cliente GetClientePorId(int? id);
    void DeleteClientePorId(int? id);
}

Representa o contrato que define a lógica do negócio.

2- IDataService

public interface IDataService
{
    List<Cliente> GetClientes();
    void AddCliente(Cliente cliente);
    void UpdateCliente(Cliente cliente);
    Cliente GetCliente(int? id);
    void DeleteCliente(int? id);
}

Representa o contrato que define a lógica de acesso aos dados.

Com isso concluímos esta etapa e na próxima parte do artigo vamos definir os demais projetos.

"O sumo sacerdote lhe tornou a perguntar, e disse-lhe: És tu o Cristo, Filho do Deus Bendito?
E Jesus disse-lhe: Eu o sou, e vereis o Filho do homem assentado à direita do poder de Deus, e vindo sobre as nuvens do céu."
Marcos 14:61-62

Referências:


José Carlos Macoratti