Create
Método Create: Implementação e Organização dos Repositórios
Estrutura do Diretório de Repositórios
Um diretório denominado Repositories será criado, contendo uma classe chamada ProductRepository. Esta implementação inicial é considerada básica, não representando a versão final da arquitetura.
Convenção de Nomenclatura
O sufixo Repository passa a ser utilizado para cada modelo existente no sistema, estabelecendo um padrão consistente de nomenclatura. Para o modelo Product, a classe correspondente será ProductRepository.
Implementação do Método Create
No núcleo do ProductRepository, são implementados métodos de forma assíncrona, visando otimização de performance e responsividade do sistema. Como exemplo, será implementado o método CREATE.
Assinatura do Método
public async Task<Product> CreateAsync
(Product product, CancellationToken cancellationToken = default)Características da assinatura:
Sufixo Async: Métodos assíncronos utilizam o sufixo Async para clareza semântica
Tipo de Retorno: Task<Product> permite retornar o produto após persistência
Parâmetros:
Product product: entidade a ser cirada
CancellationToken cancellationToken = default: Token para cancelamento de operações assíncronas
Considerações sobre o Tipo de Retorno
O tipo de retorno pode variar conforme a necessidade:
Task<void> ou Task: quando nenhum retorno é necessário
Task<Product>: quando se deseja retornar a entidade persistida
No cenário atual, opta-se por retornar Task<Product> pois o Entity Framework, ao persistir a entidade, gera automaticamente o valor do campo Id (quando configurado como identity no banco de dados), permitindo que este valor seja imediatamente disponibilizado.
Injeção de Dependência e Primary Constructor
O AppDbContext é injetado utilizando o recurso de Primary Constructor introduzido em versões recentes do C#:
Esta abordagem elimina a necessidade de declaração explícita de campos e construtores, simplificando a implementação.
Implementação do Método CreateAsync
Explicação ponto a ponto
Assinatura do método
publicO método é exposto publicamente e pode ser utilizado por outras camadas da aplicação, como serviços de aplicação ou controladores.asyncIndica que o método é assíncrono, permitindo o uso deawaitpara operações de I/O sem bloquear a thread.Task<Product>Retorna uma operação assíncrona que, ao ser concluída, fornece a instância deProductpersistida no banco de dados.CreateAsyncNome que expressa claramente a intenção do método: criar e persistir uma nova entidadeProductde forma assíncrona.Parâmetros:
Product productInstância da entidadeProductque será adicionada ao banco de dados.CancellationToken cancellationToken = defaultToken opcional utilizado para cancelar a operação assíncrona, caso necessário.
Corpo do método
await context.Products.AddAsync(product, cancellationToken)
await context.Products.AddAsync(product, cancellationToken)Adiciona a entidade
productaoDbContextde forma assíncrona.O Entity Framework Core:
Anexa a entidade ao contexto.
Define seu estado como
Added.
A entidade será inserida no banco de dados somente quando
SaveChangesAsyncfor executado.O método assíncrono é especialmente útil quando o provedor de banco realiza operações adicionais durante a adição (como geração de chaves).
await context.SaveChangesAsync(cancellationToken)
await context.SaveChangesAsync(cancellationToken)Persiste no banco de dados todas as alterações pendentes no
DbContext.Executa o
INSERTcorrespondente à entidade marcada comoAdded.O
cancellationTokenpermite interromper a operação antes de sua conclusão.
return product
return productRetorna a instância de
Productapós a persistência.Caso o banco gere valores automaticamente (por exemplo, chave primária, colunas calculadas ou valores default), esses valores já estarão preenchidos no objeto retornado.
Considerações e boas práticas
Validação de dados: recomenda-se validar a entidade antes da persistência (ex.: regras de domínio, invariantes e constraints).
Transações:
SaveChangesAsyncé executado em transação implícita; para cenários mais complexos, podem ser utilizadas transações explícitas.Exceções: trate exceções relacionadas a violações de integridade (ex.: chaves únicas) em camadas superiores.
Cancelamento: a propagação do
CancellationTokencontribui para previsibilidade e controle em fluxos assíncronos.Retorno da entidade: retornar a entidade criada facilita confirmações, logging e respostas em APIs REST.
Comportamento do Entity Framework
Quando o campo Id é definido como int (e configurado como identity no banco), o valor é gerado pelo SGBD durante a inserção. O Entity Framework recupera automaticamente este valor após a execução do SaveChangesAsync(), preenchendo a propriedade Id da entidade.
Fluxos
Considerações sobre Unit of Work
Posteriormente será abordado o padrão Unit of Work, que o Entity Framework já implementa internamente através do DbContext. Cada instância do contexto representa uma unidade de trabalho, gerenciando transações e consistência de dados.
Token de Cancelamento (CancellationToken)
A utilização de CancellationToke em métodos assíncronos é recomendada por várias razões:
Cancelamento de Operações Longas: Permite interromper operações demoradas
Execução em Batch: Especialmente útil em processamentos em lote
Responsividade: Permite que a aplicação responda a solicitações de cancelamento do usuário
Gerenciamento de Recursos: Libera recursos quando operações são canceladas
O parâmetro default utiliza o token padrão quando nenhum é especificado explicitamente.
Com esta implementação, o método CreateAsync está finalizado e pronto para ser utilizado pelos endpoints da API, mantendo a separação de responsabilidades e preparando o sistema para futuras evoluções arquiteturais.
Atualizado




