services net mvc iservicecollection inyeccion injection framework dependency dependencias configureservices asp c# asp.net asp.net-mvc dependency-injection asp.net-core

c# - mvc - ¿Cómo liberar recursos y disponer del servicio inyectado en ASP.NET 5/Core al final de la solicitud?



inyeccion de dependencias.net core (2)

Tengo un servicio que se inyecta en un controlador utilizando el Contenedor de inyección de dependencias predeterminado de ASP.NET Core:

public class FooBarService : IDisposable { public void Dispose() { ... } } services.AddScoped<FooBarService>();

Esto crea una instancia por solicitud. ¿Cómo asegurar que el framework descartaría la instancia de FooBarService al final de cada solicitud, sin depender de destructores y recolección de basura?


Al igual que todos los demás contenedores DI, dispondrá de instancias identificables para usted con respecto al tiempo de vida de la instancia.

En su situación, si la instancia se registra como Scoped (instancia por solicitud). Dispondrá de esta instancia una vez completada la solicitud.

Editar : en documentos oficiales no mencionan esto. Entonces, revisemos el código fuente para estar seguros:

Cuando se crea un ámbito, ServiceScopeFactory devuelve un nuevo ServiceScope que depende de ServiceProvider y es desechable.

ServiceProvider tiene private List<IDisposable> _transientDisposables; que mantiene los servicios desechables cuando TransientCallSite se invoke en el método CaptureDisposable . También ServiceProvider tiene private readonly Dictionary<IService, object> _resolvedServices = new Dictionary<IService, object>(); que mantiene todos los servicios para Scoped .

Cuando termine el alcance / alcance, se descarta el ServiceScope . Luego, dispone de ServiceProvider que dispone todos los datos _transientDisposables y luego comprueba _resolvedServices y dispone los servicios desechables en el diccionario en ServiceProvider .

Editar (13.06.2017): Mencionan ahora en documentos oficiales. Eliminación de servicios


Cuando se usa AddScoped es por diseño que el objeto tendrá su tiempo de vida asociado con la Solicitud.