La inyección de dependencias en .NET Core nos permite de manera simple seguir el patrón DI y optimizar el uso de las clases y servicios que inyectamos a través de la aplicación. Una de las cosas que más hay que tomar en cuenta es el uso de recursos y de memoria que esto conlleva. Si nosotros inyectamos dependencias de manera indiscriminada copiando instancias de objetos cada que hacemos ese proceso, muy pronto empezaremos a llenar la memoria de objetos que probablemente no sean necesarios y al momento de recibir muchas peticiones corremos el riesgo de degradar el performance de nuestra aplicación.
Para optimizar el uso de la inyección de dependencias, .NET Core nos ofrece varios scopes para generar la inyección en la clase Startup.cs
:
- Transient .- Cuando inyectamos una dependencia usando Transient, se generará una copia del objeto cada vez que esta dependencia sea requerida (tanto durante el request como a través de varios requests). Es el tipo de inyección más común pero también el que ocupa más memoria:
services.Addtransient<IMyInterface, Instance>();
- Scoped .- Scoped genera una única instancia del objeto durante el ciclo de vida de un request, pero generará un nuevo objeto en cada request que invoquemos:
services.AddScoped<IMyInterface, Instance>()
- Singleton .- Como su nombre lo indica, Singleton generará una única instancia del objeto tanto durante el ciclo de vida de un request como para todos los requests.
services.AddSingleton<IMyInterface, Instance>()
Entonces, ¿dónde debería aplicar cada caso?. Bien, esto depende del uso que le daremos a nuestra dependencia:
- Por ejemplo, si queremos utilizar objetos donde queremos que dicha operación sea única y que sus propiedades no se compartan por otras instancias (por ejemplo, una transacción única) entonces debemos usar Transient.
- Si por ejemplo, nuestro objeto contiene propiedades que pueden compartirse durante el ciclo de vida de un request (por ejemplo, una conexión a base de datos que va a realizar varias consultas para obtener un resultado único) deberíamos utilizar Scoped
- En cambio, si nuestro objeto necesita compartir propiedades con todas las instancias y todos los ciclos de vida de los requests de nuestra aplicación (por ejemplo, un servicio que conecta a un recurso como una impresora o cualquier servicio que utilice colas de entrada / salida) deberíamos utilizar Singleton.
Espero estos ejemplos les sean de utilidad. Hasta la próxima.
Comentarios recientes