services net microsoft inyeccion injection extensions dependencyinjection dependency dependencias asp c# asp.net-core

c# - net - microsoft extensions dependencyinjection



¿Cuáles son los escenarios prácticos para usar los métodos IServiceCollection.AddTransient, IServiceCollection.AddSingleton e IServiceCollectionAddScopped? (1)

Su comprensión de los 3 ámbitos es correcta.

Transient se usaría cuando el componente no se puede compartir. Un objeto de acceso a bases de datos no seguro para subprocesos sería un ejemplo.

Scoped se puede usar para contextos de la base de datos de Entity Framework. La razón principal es que las entidades obtenidas de la base de datos se adjuntarán al mismo contexto que todos los componentes de la solicitud. Por supuesto, si planea hacer consultas con él en paralelo, no puede usar Scoped.

Otro ejemplo de un objeto Scoped sería algún tipo de clase RequestContext , que contiene, por ejemplo, el nombre de usuario de la persona que llama. Un filtro de middleware / MVC puede solicitarlo y completar la información, y otros componentes de la línea también pueden solicitarlo, y seguramente contendrá la información para la solicitud actual.

Los componentes de Singleton se comparten siempre, por lo que son mejores para componentes seguros para subprocesos que no necesitan vincularse a una solicitud. Un ejemplo sería IOptions , que da acceso a configuraciones de configuración. Una clase contenedora HttpClient que usa SendAsync en una única instancia HttpClient estática también sería completamente segura para subprocesos y una buena candidata para ser Singleton.

Tenga en cuenta que si tiene un componente de Singleton que depende de un componente de ámbito, su dependencia se eliminará antes que él. Por lo tanto, un componente no puede depender de otro componente que tenga un alcance menor que él mismo.

Después de leer esta publicación, puedo entender las diferencias entre AddTransient , AddScopped y AddSingleton , sin embargo, no puedo ver el uso práctico de cada uno de ellos.

Mi entendimiento es

AddTransient

Crea una nueva instancia cada vez que el cliente lo solicita.

services.AddTransient<IDataAccess, DataAccess>();

devolverá un nuevo objeto de DataAccess cada vez que un código de cliente lo solicite. Más probablemente un constructor.

Uso de AddTransient

En los casos en que tenemos que acceder a una base de datos para leerla y actualizarla y destruir el objeto de acceso (DataAccess), es mejor utilizar AddTransient : no estoy seguro sobre el subproceso safty.

AddScopped

Crea una nueva instancia para cada solicitud web http.

Uso de AddScopped

services.AddScoped<ShoppingCart>(serviceProvider => ShoppingCart.GetShoppingCart(serviceProvider));

esto significa que cada solicitud web tendrá su propia instancia de carrito de compras que pasante significa que cada usuario / cliente tendrá su propia instancia de carro de compras para esa solicitud web http.

AddSingleton

Crea una instancia única para todas las solicitudes web http.

Uso de AddSingleton

Encontré este código en una aplicación de muestra pero no entiendo cómo es útil.

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

¿Puede alguien dar un ejemplo práctico decente sobre cuándo usar AddSingleton y verificar si mi comprensión de AddTransient y AddScopped es correcta?