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 :
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:
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:
NET - Unit of Work - Padrão Unidade de ...