Отношение много-к-одному извлекается из пользовательского кэша - PullRequest
0 голосов
/ 03 февраля 2012

Это больше похоже на теоретический вопрос.

У меня есть одна таблица для хранения элементов словаря, а другая - для хранения данных пользователей.Пользовательская таблица содержит множество ссылочных столбцов типа «многие к одному», указанных в таблице элементов словаря.Это выглядит следующим образом:

public class User
{
public int Id;
public Dictionary Status;
public Dictionary Type;
public Dictionary OrganizationUnit;
......
}

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

Я знаю, что могу использовать кэш 2-го уровня в этом сценарии, но меня интересует другое решение.Есть ли?Можно сделать мой пользовательский тип и сказать, что: использовать мой пользовательский кеш для получения значения словаря ??

Ответы [ 2 ]

0 голосов
/ 06 февраля 2012

Почему бы не сохранить его в сеансе?Просто извлеките набор записей один раз, вставьте его в сеанс и извлекайте его каждый раз, когда захотите.Я делаю нечто подобное для других вещей, и я считаю, что мой метод должен работать для вас.В моем коде у меня есть менеджер сеансов, который я вызываю напрямую из любого фрагмента кода, для которого нужны значения сеанса.Я выбираю этот метод, поскольку могу запрашивать результаты и манипулировать методами хранения и поиска.Когда я полагаюсь на NHibernate, чтобы выполнить кэширование для меня, у меня нет детальности контроля, чтобы определенные наборы записей были доступны только для определенных сессий.Я также считаю, что NHibernate не так эффективен, как использование сессии напрямую.При профилировании использования процессора и памяти я обнаружил, что этот метод быстрее и использует немного меньше памяти.Если вы хотите сделать это на уровне сайта вместо сеанса, посмотрите на HttpContext.Current.Cache.

Следующий пример отлично работает для хранения и получения наборов записей:

// Set the session
SessionManager.User = (Some code to pull the user record with relationships.  Set the fetch mode to eager for each relationship else you will just have broken references.)

// Get the session
User myUser = SessionManager.User;



public static class SessionManager
{
    public static User User
    {
        get { return GetSession("MySessionUser") as User; }
        set { SetSession("MySessionUser", value); }
    }

    private static object GetSession(string key)
    {
        // Fix Null reference error
        if (System.Web.HttpContext.Current == null || System.Web.HttpContext.Current.Session == null)
        {
            return null;
        }
        else
        {
            return System.Web.HttpContext.Current.Session[key];
        }
    }

    private static void SetSession(string key, object valueIn)
    {
        // Fix null reference error
        if (System.Web.HttpContext.Current.Session[key] == null)
        {
            System.Web.HttpContext.Current.Session.Add(key, valueIn);
        }
        else
        {
            System.Web.HttpContext.Current.Session[key] = valueIn;
        }
    }
}
0 голосов
/ 04 февраля 2012

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

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

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