C#: Registrar las dependencias de un módulo usando extensiones
ASP.NET permite configurar la inyección de dependencias en el Startup.cs. En UBIK, por ejemplo, registramos nuestras dependencias en el método Configure:
Esta es la forma estándar y la que se aprende primero, pero tiene varias desventajas:
- Quien vaya a usar el módulo debe conocer todas sus dependencias y registrarlas en el Startup.cs.
- Todas las interfaces y las implementaciones deben ser públicas.
- Alguien podría solicitar una instancia de ICubeStore, cuando lo correcto es acceder a través de ICubeService.
- Crear nuevos servicios implica modificar el Startup.cs para registrar las dependencias.
Por eso en AnniQ intentamos algo distinto y creamos una extensión para IServiceCollection dentro de cada módulo, que le permite "registrarse a sí mismo".
Esta estrategia cubre las desventajas de la implementación anterior:
- Quien vaya a usar el módulo sólo debe importar y utilizar la extensión IServiceCollection.RegisterUploadModule en Startup.cs.
- Sólo las interfaces de ciertos servicios deben ser públicas, el resto pueden ser internal.
- Nadie podrá solicitar instancias de servicios que no sean públicos.
- El Startup.cs no se debe modificar porque cada módulo conoce cómo registrarse a sí mismo.
Algunas notas finales:
- El primer ejemplo es de Azure Functions, por eso utiliza IFunctionHostBuilder.
- El segundo es de ASP.NET MVC, por eso utiliza IServiceCollection.
- El uso de AddScoped o AddTransient no tiene nada que ver con la estrategia, son decisiones de diseño de cada proyecto.
Comentarios
Publicar un comentario