Tengo un controlador simple ASP.NET MVC
. Dentro de algunos métodos de acción, accedo a un recurso que diré que es costoso.¿Cómo puedo usar Lazy <T> en un controlador ASP.NET MVC?
Así que pensé, ¿por qué no hacerlo estático. Entonces, en lugar de hacer double checked locking, creo que puedo aprovechar el uso de Lazy<T>
en .NET 4.0. Llame al servicio caro una vez en lugar de varias veces.
Por lo tanto, si este es mi código pseduo, ¿cómo puedo cambiarlo? Use Lazy<T>
. Para este ejemplo contrito, usaré el File System
como el recurso costoso recurso Así que con este ejemplo, en vez de obtener todos los archivos de la ruta de destino, cada vez que una solicitud llama a ese Método de Acción, esperaba usar Lazy para mantenga esa lista de archivos ... que por supuesto, hace la llamada por primera vez solamente.
Siguiente suposición: no se preocupe si se cambia el contenido. Eso está fuera de alcance, aquí.
public class FooController : Controller
{
private readonly IFoo _foo;
public FooController(IFoo foo)
{
_foo = foo;
}
public ActionResult PewPew()
{
// Grab all the files in a folder.
// nb. _foo.PathToFiles = "/Content/Images/Harro"
var files = Directory.GetFiles(Server.MapPath(_foo.PathToFiles));
// Note: No, I wouldn't return all the files but a concerete view model
// with only the data from a File object, I require.
return View(files);
}
}
¿Qué pasa con el uso de la memoria caché ASP.NET? – tvanfosson
Parece que está buscando un singleton, en lugar de instanciación lenta de un objeto. Por supuesto, puedes * usar * 'Lazy' para crear un singleton ... –