Estoy pasando por una gran refactorización / ajuste de velocidad de una de mis aplicaciones MVC más grandes. Se ha implementado en producción desde hace unos meses y estaba empezando a tener tiempos de espera esperando conexiones en el grupo de conexiones. He rastreado el problema hasta que las conexiones no se eliminan correctamente.
A la luz de eso, desde entonces hice este cambio en mi controlador base:
public class MyBaseController : Controller
{
private ConfigurationManager configManager; // Manages the data context.
public MyBaseController()
{
configManager = new ConfigurationManager();
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (this.configManager != null)
{
this.configManager.Dispose();
this.configManager = null;
}
}
base.Dispose(disposing);
}
}
Ahora tengo dos preguntas:
- ¿Estoy introduciendo una condición de carrera? Dado que
configManager
administra elDataContext
que expone losIQueryable<>
parámetros a las vistas, necesito asegurarme de queDispose()
no se llamará en el controlador antes de que la vista termine de renderizarse. - ¿El marco MVC llama
Dispose()
al controlador antes o después de que se renderice la vista? ¿O el marco MVC deja eso en manos de GarbageCollector?