Ahora en mi trabajo tengo que realizar parte de backend, por lo tanto decidí hacer un pequeño proyecto en .NET 6 para empezar a familiarizarme y noté un patrón similar.
Único y detergente
Me aburre un poco tomar un backend, conectarlo a una base de datos y hacer un clásico CRUD, eso es muy obvio y clásico para mí. Si te interesa realizar justo eso, te dejo el tutorial al final.
La verdad siempre los backends que he conocido te guían bien en esa tarea, pero yo quiero algo más.. Me interesa conocer cómo funciona la inyección de dependencias y el patrón de repositorios acá.
¿Qué podemos rescatar de Angular y NestJS?
Hay un sistema modular que se encarga de encapsular y "contener" las dependencias; en otras palabras, hay un sistema inicial que provee esos módulos.
En el caso de un servicio en Angular, uno define un providedIn y le sueles definir 'root' para que este contenido en AppModule o en todo el proyecto.
Hay un constructor en el que defines las dependencias que vas a utilizar, si no esta en un módulo padre te dará error.
De igual modo puedes utilizar servicios, dentro de otros servicios.
¿Qué es el patrón de repositorios?
Lo conocí con NestJS y no quiero indagar mucho en él; simplemente es dejar el CRUD (Create, Read, Update and Delete) en un servicio encargado de realizar las consultas a la base de datos y luego el controlador utiliza esos repositorios para proveer la información al cliente.
¿Qué tiene de interesante todo esto?
Todo el rato me he enfocado en servicios y eso es justo de lo que trata mi proyecto, como llamar servicios al controlador, utilizando inyección de dependencias en .NET 6.
El proyecto se llama GoodMorning y buscaba conocer la fecha actual consultando un servicio, como si lo estuviera haciendo en Angular (mas o menos ... )
Proyecto GoodMorning
(Repositorio al final)
Incluí 1 controlador, 1 modelo y 1 servicio. El controlador simplemente devuelve lo que me da el servicio y el servicio realiza un GET hacia un API público que me da la fecha actual dependiendo de la zona horaria que le envíe.
Controlador
- Lo que dice Route(GoodMorning) y HttpGet("Time") son como los "decorators", también puedes meter middlewares del mismo modo.
- La función que tiene el mismo nombre que la clase, es el encargado de inyectar las dependencias, en este caso dependo de TimeAPIService, el que me da la respuesta al servicio.
- Dentro del GET del controlador hago la operación asíncrona y simplemente utilizo el servicio.
Servicio
- Este es el servicio que realiza la llamada, depende de HttpClient y le seteo un BaseAddress, de igual modo como creo mis servicios para mis APIs.
- Arriba esta una pequeña interfaz para posteriormente usarla al registrarla en el contenedor primario de dependencias.
- Este es el Program.cs, es donde inicia todo .. como si fuera un AppModule.
- Realmente toda esta base vino con el proyecto, solo debí registrar los servicios en la línea 12 y 13.
Como pueden apreciar, registré TimeAPI como dependiente de HttpClient, me quedé como 2 días con el error:
"InvalidOperationException: Unable to resolve service for type 'GoodMorning.Services.TimeAPIService' while attempting to activate 'GoodMorning.Controllers.GoodMorningController'."
Hasta que mis neuronas reaccionaron y no entendía cómo el servicio podía hacer uso de HttpClient y fue como un ¡Eureka!
Bonus
Los lambdas function en C# son como los arrow functions en sintaxis, me queda investigar si el this funciona igual