Как я могу кешировать экземпляры объектов? - PullRequest
0 голосов
/ 09 ноября 2009

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

Теперь я бы хотел перейти на следующий уровень. Я бы хотел сократить время загрузки за счет кэширования экземпляра объекта. Я не уверен, что мне ясно, поэтому я объясню немного больше. У меня есть объект сотрудника, который (например, ради) имеет 50 свойств. Некоторые из этих свойств представляют собой общие списки других связанных объектов (например, список сетевых активов, принадлежащих этому сотруднику). Поэтому, когда я создаю экземпляр объекта employee для сотрудника № 30455, мне не нужно обращаться к базе данных (обязательно), потому что эта часть кэшируется.

НО, мне нужно запустить список свойств, заполнив их данными из datarows из набора кэшированных данных. Я также должен заполнить те общие списки, которые я выбрал для включения в заголовок. Похоже, я должен быть в состоянии кэшировать этот объект, поэтому мне не нужно делать все это снова. Мысли? * * 1005

Ответы [ 3 ]

3 голосов
/ 09 ноября 2009

Похоже, вы пытаетесь повторно реализовать NHibernate . Это гигантское начинание. NHibernate кеширует то, о чем вы здесь говорите, через кеш первого и второго уровня. Я не уверен, как это реализовано там, но они используют Session объекты, срок действия которых истекает, как правило, когда веб-запрос заканчивается. Все может быть кэшировано в данном Session путем хранения объектов в памяти.

Включает ли ваш уровень данных какой-либо тип объекта на основе сеанса, подобный этому? Если нет, вы можете выполнить очень грубое кеширование через общедоступный статический словарь, который вы поддерживаете на протяжении всей жизни, что соответствует сеансу в NHibernate.

0 голосов
/ 09 ноября 2009

Это шаблон, который я использую для того, что, по вашему мнению, вы пытаетесь выполнить:

public class Foo
{
   private static Dictionary<int, Foo> FooCache = new Dictionary<int, Foo>();

   private Foo(int id) 
   {
      // logic for creating/looking up/whatever Foo objects from their ID
      // goes here 
   }

   public static Foo CreateFoo(int id)
   {
      if (!FooCache.ContainsKey(id))
      {
         FooCache.Add(id, new Foo(id));
      }
      return FooCache[id];
   }
}

Конечно, вы можете реализовать конструктор Foo и метод CreateFoo, чтобы они принимали дополнительные аргументы помимо id (например, объект DataRow, который используется для заполнения объекта Foo).

0 голосов
/ 09 ноября 2009

Одна мысль, которая у меня возникла, - создать экземпляр объекта сотрудника, используя метод вместо конструктора. Тогда я могу сделать что-то вроде ...

public static Employee getEmployee(int EmployeeId)
    {
        HttpContext context = HttpContext.Current;
        string key = e.ToString() + "_" + EmployeeId;

        Employee e = (Employee)context.Session[key];
        if (e == null)
        {
            e = new Employee(EmployeeId);
            context.Session[key] = e;
        }
        return e;
    }

... чтобы я мог просто ...

Employee e = Employee.getEmployee(35440);

Я уже делаю это в некоторых местах, но я никогда не чувствовал, что это лучший способ ... кажется более правильным всегда создавать экземпляр с помощью конструктора. Есть ли лучший способ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...