Возможные решения для удаления использовать хеш-таблицы


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

    public string Value { get; set; }
    public string Name { get; set; }
    public string Notes { get; set; }

    /// <summary>
    /// Gets the selected setting from cache if it exists, 
    ///     else returns the supplied default value
    /// </summary>
    /// <param name="settingName"></param>
    /// <param name="defaultValue"></param>
    /// <returns></returns>
    public static string GetCacheSetting(string settingName, string defaultValue)
    {
        return LoadSettings().Contains(settingName) ? Convert.ToString(LoadSettings()[settingName]) : defaultValue;
    }

    /// <summary>
    /// Returns the selected setting value from cache.
    /// If cache is null then rebuild the cache.
    /// </summary>
    /// <returns></returns>
    public static Hashtable LoadSettings()
    {
        Hashtable h;
        h = (Hashtable)HttpRuntime.Cache["SiteSettings"];

        if (h == null)
        {
            h = new Hashtable();

            DataAccess da = new DataAccess(); //My DAL

            foreach (DataRow row in da.GetSiteSettings().Tables[0].Rows)
            {
                Settings oSetting = new Settings();
                oSetting.SettingsInitFromRow(row);
                h.Add(oSetting.Name, oSetting.Value);
            }

            HttpRuntime.Cache.Insert("SiteSettings", 
                                    h, 
                                    null, 
                                    DateTime.Now.AddMinutes(120), 
                                    Cache.NoSlidingExpiration);
        }

        return h;
    }

    /// <summary>
    /// Sets the values for the cache items
    /// </summary>
    /// <param name="row"></param>
    private void SettingsInitFromRow(DataRow row)
    {
        this.Name = (string)row["Name"];
        this.Value = (string)row["Value"];
    }

Настройки хранятся в базе данных и созданного во время установки/изменения по мере необходимости. На большинство у меня от 20 до 30 значений в базе данных. Я использую хеш-таблицы, хранящиеся в кэше, чтобы получить мои ценности, чтобы избавиться от необходимости получить доступ к базе данных 2, 3 или более раза на каждой загрузке страницы просто для настройки в дополнение к остальной части времени для содержимого страницы. Делаю это в последний раз, когда я совершенно изменил его, возможно, 3 года назад.

Любые идеи?



727
3
задан 5 августа 2011 в 07:08 Источник Поделиться
Комментарии
1 ответ

Она выглядела spretty хорошо для меня, но есть пара вещей, которые я, скорее всего, изменится, ни одно из которых не связано с использованием (или неиспользованием) хеш-таблицы структуры данных, так как он идеально подходит для такого рода вещи.

Я бы, наверное, изменить LoadSettings способ немного, как это на самом деле не загружать настройки при каждом вызове, и тогда наверняка использовать универсальный словарь вместо устаревших хеш - класса, тем самым устраняя необходимость для всех, что неприятные формы. Вы могли бы также избежать двух уточняющие запросы при попытке получить значение из кэша с помощью TryGetValue , а не содержит , а затем выполнить еще один Поиск, что-то вроде:

public static string GetCacheSetting(string settingName, string defaultValue)
{
string ret;
Settings.TryGetValue( settingName, out ret );
return ret ?? defaultValue;
}

// you may even want to make this private as a caller could
// edit the contents of the cache directly. You could leave
// GetCacheSetting as the only access point, adding a
// SetCacheSetting method if needed.
private static Dictionary<string, string> _settings;
public static Dictionary<string, string> Settings
{
get
{
if( _settings == null )
{
_settings = LoadSettings();
}

return _settings;
}
}

private static Dictionary<string, string> LoadSettings()
{
HttpRuntime.Cache.Remove( _settings );
_settings = new Dictionary<string,string>();
DataAccess da = new DataAccess(); //My DAL
foreach (DataRow row in da.GetSiteSettings().Tables[0].Rows)
{
Settings oSetting = new Settings();
oSetting.SettingsInitFromRow(row);
_settings.Add(oSetting.Name, oSetting.Value);
}

HttpRuntime.Cache.Insert("SiteSettings",
_settings,
null,
DateTime.Now.AddMinutes(120),
Cache.NoSlidingExpiration);

return _settings;
}

4
ответ дан 5 августа 2011 в 08:08 Источник Поделиться