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:

  1. Quien vaya a usar el módulo debe conocer todas sus dependencias y registrarlas en el Startup.cs.
  2. Todas las interfaces y las implementaciones deben ser públicas.
  3. Alguien podría solicitar una instancia de ICubeStore, cuando lo correcto es acceder a través de ICubeService.
  4. 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:
  1. Quien vaya a usar el módulo sólo debe importar y utilizar la extensión IServiceCollection.RegisterUploadModule en Startup.cs.
  2. Sólo las interfaces de ciertos servicios deben ser públicas, el resto pueden ser internal.
  3. Nadie podrá solicitar instancias de servicios que no sean públicos.
  4. El Startup.cs no se debe modificar porque cada módulo conoce cómo registrarse a sí mismo.

 Algunas notas finales:

  1. El primer ejemplo es de Azure Functions, por eso utiliza IFunctionHostBuilder.
  2. El segundo es de ASP.NET MVC, por eso utiliza IServiceCollection.
  3. El uso de AddScoped o AddTransient no tiene nada que ver con la estrategia, son decisiones de diseño de cada proyecto.

 

Comentarios

Entradas más populares de este blog

Ampliar el sistema de archivos de una máquina virtual Ubuntu

Adviento C# 2020: Diario de ASP.NET