SqlClient CacheCustom - свойствоNemiro.Data.dll
Тип пользовательского объекта кэширования. Используется совместно со свойствами CacheType и CacheCustomArgs.

Пространство имён: Nemiro.Data.Sql
Сборка: Nemiro.Data (в Nemiro.Data.dll) Версия: 2.11.4.126 (2.11.4.126)
Синтаксис

public Type CacheCustom { get; set; }

Значение свойства

Тип: Type
Заметки

Пользовательский класс, реализующий доступ к кэшу, должен быть наследован от ObjectCache.

Чтобы использовать пользовательский класс для работы с кэшем, свойство CacheType должно иметь значение Custom.

Как правило, метод кэширования указывается один раз в файле конфигурации, в параметре NeData:Sql:CacheType (для веб-приложений) или в параметре NeDataSqlCacheType (для приложений Windows).

<appSettings> 
  <clear /> 
  <!--Метод кэширования данных--> 
  <add key="NeData:Sql:CacheType" value="Custom" /> 
  <!--Имя типа пользовательского кэша--> 
  <add key="NeData:Sql:CacheCustom" value="MyCache" /> 
  <!--Список дополнительных параметров (через запятую), которые будут переданы в конструктор пользовательского кэша--> 
  <add key="NeData:Sql:CacheCustomArgs" value="1,test,123" /> 
</appSettings>

Работа реализации пользовательских механизмов кэширования на данный момент не проверена и не гарантируется.

Примеры

В следующем примере программно устанавливается пользовательский метод кэширования данных и выполняется запрос к SQL Server методом GetTable  с кэшированием результатов на 60 секунд.

using (SqlClient client = new SqlClient())
{
  // кэширование результатов в файлом кэше на 60 секунд
  client.CacheDuration = 60;
  // устанавливаем пользовательский тип кэширования
  client.CacheType = CachingType.Custom;
  // указываем пользовательский тип кээширования
  client.CacheCustom = typeof(MyCache);
  // формирование запроса
  client.CommandText = "SELECT * FROM messages";
  // выполнение запроса 
  var table = client.GetTable();
  // вывод результатов
  Console.WriteLine("Получено данных: {0}", table.Rows.Count);
  Console.WriteLine("Время выполнения запроса: {0}", client.LastQueryTime);
  Console.WriteLine("Результат получен из кэша: {0}", client.LastQueryResultsFromCache);
}

Ниже показан пример реализации класса пользовательского кэша на C#. Это копия кода класса WebCache.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Caching;
using System.Web;

public class MyCache : ObjectCache
{

  private System.Web.Caching.Cache _Instance = null;

  // Политика кэширования по умолчанию. 
  public CacheItemPolicy DefaultPolicy { get; set; }

  public WebCache()
  {
    if (HttpContext.Current != null)
    {
      _Instance = HttpContext.Current.Cache;
      this.DefaultPolicy = new CacheItemPolicy();
    }
    else
    {
      throw new Exception("HttpContext is requred.");
    }
  }

  public WebCache(HttpContext context)
  {
    _Instance = context.Cache;
    this.DefaultPolicy = new CacheItemPolicy();
  }

  // Вставляет запись в кэш, используя указанную пару "ключ-значение" и заданные сведения о методе ее удаления. 
  public override object AddOrGetExisting(string key, object value, CacheItemPolicy policy, string regionName = null)
  {
    object result = _Instance[key];
    _Instance.Add(key, value, null, policy.AbsoluteExpiration.DateTime, policy.SlidingExpiration, System.Web.Caching.CacheItemPriority.Default, null);
    return result;
  }

  // Добавляет запись в кэш, используя заданный экземпляр CacheItem и сведения о способе удаления записи. 
  public override CacheItem AddOrGetExisting(CacheItem value, CacheItemPolicy policy)
  {
    object result = this.AddOrGetExisting(value.Key, value.Value, policy, value.RegionName);
    if (result == null) { return null; }
    return new CacheItem(value.Key, result, value.RegionName);
  }

  // Добавляет запись в кэш, используя заданную пару "ключ-значение" и абсолютное значение срока действия.   
  public override object AddOrGetExisting(string key, object value, DateTimeOffset absoluteExpiration, string regionName = null)
  {
    CacheItemPolicy policy = new CacheItemPolicy();
    policy.AbsoluteExpiration = absoluteExpiration;
    return this.AddOrGetExisting(key, value, policy, regionName);
  }

  // Определяет, существует ли в кэше запись кэша. 
  public override bool Contains(string key, string regionName = null)
  {
    return _Instance[key] != null;
  }

  // При переопределении в производном классе создает объект CacheEntryChangeMonitor, который может активировать события в ответ на изменения указанных записей кэша. 
  public override CacheEntryChangeMonitor CreateCacheEntryChangeMonitor(IEnumerable<string> keys, string regionName = null)
  {
    throw new NotImplementedException();
  }

  // Содержит описание функций, предоставляемых реализацией кэша. 
  public override DefaultCacheCapabilities DefaultCacheCapabilities
  {
    get
    {
      return DefaultCacheCapabilities.AbsoluteExpirations | DefaultCacheCapabilities.SlidingExpirations;
    }
  }

  // Получает из кэша указанную запись кэша в виде объекта. 
  public override object Get(string key, string regionName = null)
  {
    return _Instance.Get(key);
  }

  // Получает из кэша указанную запись кэша в виде экземпляра CacheItem. 
  public override CacheItem GetCacheItem(string key, string regionName = null)
  {
    return new CacheItem(key, this.Get(key, regionName), regionName);
  }

  // Получает общее число записей в кэше. 
  public override long GetCount(string regionName = null)
  {
    return _Instance.Count;
  }

  // Создает перечислитель, который может использоваться для перебора записей кэша в коллекции. 
  protected override IEnumerator<KeyValuePair<string, object>> GetEnumerator()
  {
    List<KeyValuePair<string, object>> result = new List<KeyValuePair<string, object>>();
    System.Collections.IDictionaryEnumerator em = _Instance.GetEnumerator();
    while (em.MoveNext())
    {
      result.Add(new KeyValuePair<string, object>(em.Key.ToString(), em.Value));
    }
    return result.GetEnumerator();
  }

  // Получает набор записей кэша, соответствующих указанным ключам. 
  public override IDictionary<string, object> GetValues(IEnumerable<string> keys, string regionName = null)
  {
    Dictionary<string, object> result = new Dictionary<string, object>();
    foreach (string key in keys)
    {
      result[key] = this.Get(key, regionName);
    }
    return result;
  }

  // Имя экземпляра. 
  public override string Name
  {
    get { return "ASP .NET"; }
  }

  // Удаляет запись из кэша. 
  public override object Remove(string key, string regionName = null)
  {
    return _Instance.Remove(key);
  }

  // Вставляет запись в кэш в виде экземпляра CacheItem и задает сведения о способе удаления записи. 
  public override void Set(string key, object value, CacheItemPolicy policy, string regionName = null)
  {
    base.Add(key, value, policy, regionName);
  }

  // Вставляет запись в кэш в виде экземпляра CacheItem и задает сведения о способе удаления записи. 
  public override void Set(CacheItem item, CacheItemPolicy policy)
  {
    base.Add(item, policy);
  }

  // Вставляет запись в кэш. 
  public override void Set(string key, object value, DateTimeOffset absoluteExpiration, string regionName = null)
  {
    base.Add(key, value, absoluteExpiration, regionName);
  }

  public override object this[string key]
  {
    get
    {
      return this.Get(key, null);
    }
    set
    {
      this.Set(key, value, this.DefaultPolicy, null);
    }
  }

}
См. также