2009-05-16 13 views
15

Estoy migrando una aplicación MonoRail al ASP.NET MVC 1.0. En mi aplicación original escribí un proveedor de caché personalizado (un proveedor de caché distribuida usando memcached). En monorraíl esta tarea fue muy fácil porque el marco utiliza las interfaces y hay ICacheProvider que tiene este aspecto:Cómo implementar un proveedor de caché personalizado con ASP.NET MVC

public interface ICacheProvider : IProvider, IMRServiceEnabled 
{ 
    void Delete(string key); 
    object Get(string key); 
    bool HasKey(string key); 
    void Store(string key, object data); 
} 

Una instancia de esta interfaz está disponible en cada acción del controlador. Entonces, todo lo que tenía que hacer era implementar un proveedor de caché personalizado que utilizara memcached y dijera MonoRail para usar mi proveedor de caché en lugar del predeterminado. También fue muy fácil burlarse y probar la unidad de mi controlador.

En ASP.NET MVC 1.0 está el ensamblaje System.Web.Abstractions (nombre parece prometedor) que define la HttpContextBase así:

public abstract class HttpContextBase : IServiceProvider 
{ 
    ... 
    public virtual System.Web.Caching.Cache Cache { get; } 
    ... 
} 

No entiendo cómo la propiedad de caché se utiliza aquí es una abstracción de un proveedor de caché. Es el legado sellado Cache clase. Parece que no soy el único struggling to mock fuera de las clases en el marco.

Soy muy nuevo en el framework ASP.NET MVC y me falta algo aquí. Podría escribir CustomBaseController que utiliza una interfaz ICacheProvider que defino y todos mis controladores derivan de esta clase base, pero si hay una solución más elegante (ASP.NET MVCish), me complacería implementarla. Me he dado cuenta de que HttpContextBase implementa IServiceProvider. ¿Dónde está el método GetService para buscar servicios? ¿Se puede burlar fácilmente de esto?

Respuesta

18

caché no tiene una abstracción oficial o proveedor, pero se puede construir fácilmente una:

ASP.NET 4.0 incluye un output cache provider abstraction (que yo sepa no una abstracción general de caché pero solo para salida almacenamiento en caché)

+3

@mausch, eso es exactamente lo que terminé haciendo. Lo único que no queda claro desde la primera publicación es cómo inyectar la abstracción de caché en la interconexión HttpContext utilizando un IoC, por ejemplo, para poder acceder a él desde cualquier lugar. –

+4

No trataría de inyectarlo en HttpContext. En su lugar, simplemente inyéctele abstracción (ICache o como se llame) en sus controladores. –

Cuestiones relacionadas