Un proyecto .NET Core de muestra con una base de datos MongoDB con conjunto de réplicas y transacciones habilitadas.
El objetivo de este proyecto es dar una solución al siguiente tema (utilizado para una entrevista de trabajo):
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 es un proyecto de API web asp core 3.1 con una arquitectura de n niveles:
Cada capa tiene su propia capa de abstracción para evitar dependencias. Estoy usando el motor IOC y DI estándar de .net core.
No hice ninguna prueba unitaria porque no existe una lógica empresarial. Sin embargo, hice una muestra de una prueba de integración utilizando la biblioteca Microsoft WebHost . Puede ejecutar las pruebas de integración a través de Visual Studio o la línea de comandos, pero no olvide ejecutar Docker-Compose primero (de lo contrario, no tendrá ninguna base de datos para solicitar).
La implementación de DAL utiliza el controlador MongoDB C#. Al ejecutar Docker-compose adjunto a la solución, obtendrá una instancia de un servidor Mongo con un conjunto de réplicas habilitado (para admitir transacciones).
Como demostración del uso de una de las funciones avanzadas de MongoDB, elegí transacciones. Entonces IClientSessionHandle se inyecta en todos los repositorios. También logré crear un middleware llamado TransactionFilter que crea una transacción para toda la solicitud HTTP. De esta manera, podemos realizar operaciones de múltiples documentos, en diferentes repositorios, que pueden revertirse si ocurre un problema, sin tener que lidiar manualmente con transacciones de múltiples documentos.
Ejemplo :
Está funcionando tal como está, pero necesitaría más pruebas de carga. Es posible que esto no esté listo para producción.
El uso de docker-compose up en la línea de comandos no parece funcionar con la API en este momento. No me quedaba mucho tiempo así que seguí usando VS para componer.