Del curso: .NET 8 esencial

Inyección de servicios basados en llaves - Tutorial de .NET

Del curso: .NET 8 esencial

Inyección de servicios basados en llaves

Ahora, .NET 8 soporta registrar objetos con una llave única en el contenedor de inyección de dependencias. Esto es útil cuando, por ejemplo, necesitamos diferentes implementaciones de una misma interfaz y requerimos usar una u otra según la lógica de la aplicación. Por ejemplo, aquí tengo esta aplicación de la empresa ficticia Wisdom Pet Medicine, donde agregué esta interfaz llamada IStorageService, que tiene como intención ser el servicio para subir fotos o imágenes de las mascotas. Por acá tengo la implementación concreta para usar Azure como almacenamiento y por acá, otra clase llamada AwsStorageService para utilizar AWS. Claro que no tengo la lógica en este momento, pero realmente no importa. Aquí lo más destacable es ver que tengo dos clases que implementan la misma interfaz. Muy bien, acá en Program.cs, en la línea 9, lo que voy a hacer es utilizar este objeto, que es de tipo IServiceCollection, ya que aquí voy a encontrar estos métodos que comienzan con la frase AddKeyed, tanto para Scoped como para Singleton como para Transient, que son los diferentes ciclos de vida que soporta aquí el contenedor de inyección de dependencias. Entonces, por ejemplo, si quiero registrar el objeto AzureStorageService, pues vamos a seguir esto que nos está sugiriendo incluso Copilot. IStorageService, seguido de la implementación concreta y le estamos poniendo el identificador único que, en este caso, es Azure. Ahora voy a hacer lo mismo, pero con AwsStorageService. De nueva cuenta, aquí me voy a apoyar con Copilot y el identificador único es Aws. Perfecto. Entonces, dos implementaciones diferentes de una misma interfaz diferenciadas a través de esta clave o llave única. Muy bien. Entonces, para inyectar una u otra implementación, utilizamos un atributo que se llama FromKeyedServices. Vamos a ver cómo es esto. Aquí voy a irme, digamos, a la página de edición de mascotas y justamente aquí voy a inyectar IStorageService, de esta forma, le vamos a poner storageService, pero le voy a poner el atributo FromKeyedServices. Y justamente aquí, necesitamos identificar esta clave o llave única, por ejemplo, Azure. Entonces, lo que estamos indicando aquí es que necesitamos el objeto que implementa la interfaz IStorageService, pero que está registrado con este identificador. Vamos a poner aquí un punto de interrupción y vamos a iniciar la aplicación. Aquí está corriendo la aplicación, vámonos al catálogo de mascotas, vamos a editar a esta mascota. Entra el punto de interrupción y por acá, podemos ver que, efectivamente, es el objeto AzureStorageService, el cual se está inyectando. Vamos a detener esto y vamos a cambiar el identificador para utilizar Aws. Volvemos a iniciar. De nueva cuenta, navegamos a Pets. Vamos a editar esta mascota. Y por acá, vemos que se está inyectando, efectivamente, el objeto AwsStorageService. Como podrás apreciar, esta es una característica que puede resultar muy útil en nuestras aplicaciones de .NET 8.

Contenido