Sourcing AppSettings из базы данных и кеша - PullRequest
2 голосов
/ 31 января 2011

В моем офисе считалось, что мы должны поместить наши AppSettings для Web.Config в базу данных. Таким образом, я создал следующее, но у меня есть некоторые сомнения относительно пары аспектов кода.

Итак, мой вопрос:
Строка, содержащая «Cache cache = new Cache ()» в классе UTILITY, вероятно, неверна, поскольку она создает новый объект кэша.

В: Итак, что мне делать для этой строки?

... любая помощь приветствуется.

Общая цель состояла в том, чтобы сделать такой звонок:

Utility.GetConfigurationValue(ConfigurationSection.AppSettings, "myVariable");

... и автоматически извлекать его из кэша или базы данных.

КОД УТИЛИТЫ:

public static class Utility
{
    #region "Configurations"

    public static String GetConfigurationValue(ConfigurationSection section, String key)
    {
        Configurations config = new Configurations();
        Cache cache = new Cache(); // <--- This is probably wrong!!!!

        if (!cache.TryGetItemFromCache<Configurations>(out config))
        {
            config.List(SNCLavalin.US.Common.Enumerations.ConfigurationSection.AppSettings);
            cache.AddToCache<Configurations>(config, DateTime.Now.AddMinutes(15));
        }

        var result = (from record in config
                      where record.Key == key
                      select record).FirstOrDefault();

        return (result == null) ? null : result.Value;
    }

    #endregion
}

КОД РАСШИРЕНИЯ:

public static class Extensions
{
    #region "System.Web.Caching"

    public static void Remove<T>(this Cache cache) where T : class
    {
        cache.Remove(typeof(T).Name);
    }
    public static void AddToCache<T>(this Cache cache, object item, DateTime absoluteExpiration) where T : class
    {
        T outItem = null;
        if (cache.TryGetItemFromCache<T>(out outItem))
            return;

        cache.Insert(typeof(T).Name,
                item,
                null,
                absoluteExpiration,
                System.Web.Caching.Cache.NoSlidingExpiration,
                System.Web.Caching.CacheItemPriority.Normal,
                null);
    }
    public static bool TryGetItemFromCache<T>(this Cache cache, out T item) where T : class
    {
        item = cache.Get(typeof(T).Name) as T;
        return item != null;
    }

    #endregion
}

КОД КЛАССА СПИСКА:

public class Configurations : List<Configuration>
{
    #region CONSTRUCTORS

    public Configurations() : base()
    {
        initialize();
    }
    public Configurations(int capacity) : base(capacity)
    {
        initialize();
    }
    public Configurations(IEnumerable<Configuration> collection) : base(collection)
    {
        initialize();
    }

    #endregion

    #region PROPERTIES & FIELDS

    private Crud _crud;

    #endregion

    #region EVENTS
    #endregion

    #region METHODS

    private void initialize()
    {
        _crud = new Crud("CurrentDbConnection");
    }

    public Configurations List(ConfigurationSection section)
    {
        using (DbCommand dbCommand = _crud.Db.GetStoredProcCommand("spa_LIST_SecConfiguration"))
        {
            _crud.Db.AddInParameter(dbCommand, "@Section", DbType.String, section.ToString());

            _crud.List(dbCommand, PopulateFrom);
        }

        return this;
    }

    public void PopulateFrom(DataTable table)
    {
        this.Clear();

        foreach (DataRow row in table.Rows)
        {
            Configuration instance = new Configuration();
            instance.PopulateFrom(row);
            this.Add(instance);
        }
    }

    #endregion
}

КОД КЛАССА ПУНКТА:

Конфигурация публичного класса { #region CONSTRUCTORS

public Configuration()
{
    initialize();
}

#endregion

#region PROPERTIES & FIELDS

private Crud _crud;

public string Section { get; set; }
public string Key { get; set; }
public string Value { get; set; }

#endregion

#region EVENTS
#endregion

#region METHODS

private void initialize()
{
    _crud = new Crud("CurrentDbConnection");
    Clear();
}

public void Clear()
{
    this.Section = "";
    this.Key = "";
    this.Value = "";
}
public void PopulateFrom(DataRow row)
{
    Clear();

    this.Section = row["Section"].ToString();
    this.Key = row["Key"].ToString();
    this.Value = row["Value"].ToString();
}

#endregion

}

Ответы [ 2 ]

1 голос
/ 01 февраля 2011

Вы правильно определили проблему - текущий код создает новый экземпляр Cache при каждом вызове GetConfigurationValue, что не отвечает цели кэширования.Вам нужно сделать экземпляр Cache статическим, а не создавать новый экземпляр каждый раз.

public static class Utility
{
    private static Cache cache = new Cache();  // Static class variable

    #region "Configurations"

    public static String GetConfigurationValue(ConfigurationSection section, String key)
    {
        Configurations config = new Configurations();
        // Cache cache = new Cache(); --- removed

        ...
    }
}
0 голосов
/ 08 февраля 2011

ДОБАВЛЕНИЕ К ОТВЕТУ:
Я действительно (фактически) должен указать переменную кэша на что-то другое. Это не сработает, пока я не сделаю следующее в классе Utility.

private static Cache cache = System.Web.HttpRuntime.Cache;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...