В этом вопросе возникает ряд проблем, давайте посмотрим, сможем ли мы их решить...
Прежде всего, как Frode правильно указывает, вы можете запустить экземпляр AppFabric довольно счастливо на одном сервере - это то, что я делаю большую часть времени, играя с API. Очевидно, что функция высокой доступности не будет доступна, но, судя по самому вопросу, я думаю, вы уже приняли это.
Во-вторых, вы не можете использовать API AppFabric против локального кеша — локальный кеш существует только для того, чтобы сохранять переходы клиента AppFabric по сети на выделенный сервер кеша AppFabric.
Теперь о настраиваемых кешах, что, на мой взгляд, самое интересное. Я думаю, что вы хотите сделать здесь, это отделить операции с кешем от самого кеша в общий интерфейс, а затем вы пишете свой код для интерфейса во время разработки, а во время выполнения вы создаете кеш на основе информации из вашего приложения. .config/веб.config.
Итак, давайте начнем с определения нашего интерфейса:
public interface IGenericCache
{
void Add(string key, object value);
void Remove(string key);
Object Get(string key);
void Update(string key, object value);
}
И теперь мы можем определить пару реализаций, одну с использованием MemoryCache и одну с помощью AppFabric.
using System.Runtime.Caching;
class GenericMemoryCache : IGenericCache
{
public void Add(string key, object value)
{
MemoryCache cache = new MemoryCache("GenericMemoryCache");
cache.Add(key, value, null, null);
}
public void Remove(string key)
{
MemoryCache cache = new MemoryCache("GenericMemoryCache");
cache.Remove(key, null);
}
public object Get(string key)
{
MemoryCache cache = new MemoryCache("GenericMemoryCache");
return cache.Get(key, null);
}
public void Update(string key, object value)
{
MemoryCache cache = new MemoryCache("GenericMemoryCache");
cache.Set(key, value, null, null);
}
}
using Microsoft.ApplicationServer.Caching;
class GenericAppFabricCache : IGenericCache
{
private DataCacheFactory factory;
private DataCache cache;
public GenericAppFabricCache()
{
factory = new DataCacheFactory();
cache = factory.GetCache("GenericAppFabricCache");
}
public void Add(string key, object value)
{
cache.Add(key, value);
}
public void Remove(string key)
{
cache.Remove(key);
}
public object Get(string key)
{
return cache.Get(key);
}
public void Update(string key, object value)
{
cache.Put(key, value);
}
}
И мы могли бы продолжить и написать реализации IGenericCache с помощью ASP.NET Cache, NCache, memcached...
Теперь мы добавляем фабричный класс, который использует отражение для создания экземпляра одного из этих кешей на основе значений из файла app.config/web.config.
class CacheFactory
{
private static IGenericCache cache;
public static IGenericCache GetCache()
{
if (cache == null)
{
// Read the assembly and class names from the config file
string assemblyName = ConfigurationManager.AppSettings["CacheAssemblyName"];
string className = ConfigurationManager.AppSettings["CacheClassName"];
// Load the assembly, and then instantiate the implementation of IGenericCache
Assembly assembly = Assembly.LoadFrom(assemblyName);
cache = (IGenericCache) assembly.CreateInstance(className);
}
return cache;
}
}
Везде, где клиентский код должен использовать кеш, все, что нужно, это вызов CacheFactory.GetCache
, и кеш, указанный в файле конфигурации, будет возвращен, но клиенту не нужно знать, какой это кеш, потому что клиентский код все написано против интерфейса. Это означает, что вы можете масштабировать кэширование, просто изменив настройки в файле конфигурации.
По сути, то, что мы здесь написали, — это модель подключаемого модуля для кэширования, но имейте в виду, что вы жертвуете гибкостью в пользу функций. Интерфейс должен быть более или менее наименьшим общим знаменателем — вы теряете возможность использовать, скажем, модели параллелизма AppFabric или API тегов.
Отличное и более полное обсуждение программирования с использованием интерфейсов приведено в эту статью.
person
PhilPursglove
schedule
12.09.2011