Как запросить кеш вместо сущности? - PullRequest
1 голос
/ 22 апреля 2011

Сценарий:

  1. CustomerEntity представляет таблицу Customer в базе данных.
  2. Есть несколько запросов, которые возвращают CustomerEntities (список и один клиент)

Как можно «подделать» (прокси?) CustomerEntity, чтобы все запросы пытались попастькэшированные объекты CustomerEntities.Очевидно, что в каждом запросе я могу использовать шаблон кэширования в стороне для каждого отдельного запроса, но я хочу использовать его для всей таблицы Customer независимо от запроса.

(Cache-aside)

    private static readonly DataCache cache = CacheUtil.Instance.Cache;
    public List<Customer> GetCustomers()
    {
        string cacheKey = "test";
        var list = (List<Customer>)cache.Get(cacheKey);
        if (list == null)
        {
            using (var context = DataObjectFactory.CreateContext())
            {
                var customers = context.Customer.Where(w => w.CustomerId > 10).ToList();

                list = new List<Customer>();
                foreach (var customer in customers)
                    list.Add(customer);
                cache.Put(cacheKey, list);
                return list;
            }
        }
        else
        {
            return list;
        }
    }

1 Ответ

2 голосов
/ 22 апреля 2011

Это потребует написания пользовательской реализации IObjectSet<T>, которая будет либо возвращать данные из кэша, либо запрашивать реальный внутренний ObjectSet<T>. Экземпляры этой реализации будут отображаться в вашем контексте вместо значения по умолчанию ObjectSet<T>. Другой и более простой подход - просто скрыть ваш контекст и выставить запросы только указанным методом, таким как GetQuery() - все ваши запросы будут использовать этот метод вместо context.Customer, потому что context будет для них недоступен.

Вы также можете проверить Кэширование контекстной оболочки .

...