Um exemplo de projeto .NET Core com um banco de dados MongoDB com replicaset e transações habilitadas.
O objetivo deste projeto é dar uma solução para o assunto abaixo (usado para entrevista de emprego):
Please create a sample .net/C# project that includes the following elements:
- Basic CRUD functionality for a data structure of your choice.
- RESTful APIs to expose that functionality with your framework of choice (ASP.NET Web APIs, ASP.NET Core, ServiceStack (preferred), …etc).
- Uses MongoDB using C# driver.
- Please demonstrate your usage of one of MongoDB advanced features (aggregation, transactions, indexes, …etc) using C# driver.
- Please push your code to a Git repository that you can share with us.
Este é um projeto de API da web asp core 3.1 com uma arquitetura de n camadas:
Cada camada possui sua própria camada de abstração para evitar dependências. Estou usando o mecanismo IOC e DI padrão .net.
Não fiz nenhum Teste Unitário porque não existe lógica de negócio. Porém, fiz um exemplo de teste de integração usando a biblioteca Microsoft WebHost . Você pode executar os testes de integração através do visual studio ou linha de comando, mas não se esqueça de executar primeiro o docker-compose (ou então você não terá nenhum banco de dados para solicitar).
A implementação do DAL está usando o driver MongoDB C#. Ao executar o docker-compose anexado à solução, você obterá uma instância de um servidor Mongo com um replicaset habilitado (para suportar transações).
Como demonstração do uso de um dos recursos avançados do MongoDB, escolhi transações. Portanto, o IClientSessionHandle é injetado em todos os repositórios. Também consegui criar um middleware chamado TransactionFilter que cria uma transação para toda a solicitação HTTP. Desta forma, podemos realizar operações multi-documentos, em diferentes repositórios, que podem ser revertidas caso ocorra algum problema, sem lidar manualmente com transações multi-documentos.
Exemplo :
Está funcionando como está, mas precisaria de mais testes de carga. Isso pode não estar pronto para produção.
Usar docker-compose up na linha de comando não parece funcionar com a API no momento. Eu não tinha muito tempo, então continuei usando o VS para compor.