2010-10-07 10 views
17

Tengo una clase que necesita almacenar datos en un caché. Originalmente lo usé en una aplicación asp.net, así que usé System.Web.Caching.Cache.dotnet System.Web.Caching.Cache vs System.Runtime.Caching.MemoryCache

Ahora necesito usarlo en un servicio de Windows. Ahora, tal como lo entiendo, no debería usar asp.net cache en una aplicación no asp.net, así que estaba buscando en MemoryCache.

El problema es que no son compatibles, así que o bien cambio para usar MemoryCache en la aplicación asp.net, o tendré que crear un adaptador para garantizar que las dos implementaciones de caché tengan la misma interfaz (quizás deriva de ObjectCache y utiliza internamente la caché asp.net?)

¿Cuáles son las implicaciones de utilizar MemoryCache en un asp.net?

Nadav

+3

+1 pregunta interesante. Lo más obvio que vería sería que MemoryCache y ASP.NET Cache estarían compitiendo por recursos de memoria. Esto puede traducirse en un comportamiento diferente cuando hay presión de memoria, ya que cada uno ha definido de manera independiente la prioridad del elemento de caché. – Joe

Respuesta

7

Me gustaría ir con su segunda opción y cosas Refactor un poco. Me gustaría crear una interfaz y dos proveedores (que son los adaptadores):

public interface ICachingProvider 
{ 
    void AddItem(string key, object value); 
    object GetItem(string key); 
} 

public AspNetCacheProvider : ICachingProvider 
{ 
    // Adapt System.web.Caching.Cache to match Interface 
} 

public MemoryCacheProvider : ICachingProvider 
{ 
    // Adapt System.Runtime.Caching.MemoryCache to match Interface 
} 
+0

Hola Justin, Esto probablemente sea lo que haré. – Nadav

+3

Es irritante que haya dos implementaciones de caché en el BCL y que no tengan una interfaz común :( – Nadav

+5

¿Dónde cree que viviría Common Interface? Sospecho que Microsoft no quería que fuera necesario incluirlo algunos System.Runtime. *. dll como requisito para usar System.Web.Caching y también hicieron System.Runtime.Caching porque no querían que la gente tuviera que hacer referencia a System.Web. * desde sus aplicaciones. – Seph

4

Esta mañana me encontré con una biblioteca que podrían ayudar con esta situación. Es un CacheAdapter que le permite codificar contra una interfaz común y cambiar el mecanismo de caché (System.Web.Caching, System.Runtime.Cache o AppFabric) a través de la configuración.

https://bitbucket.org/glav/cacheadapter

+0

Sí, acabo de verlo ayer :) – Nadav

Cuestiones relacionadas