Хранить системные настройки и конфигурации для сайта в базе данных? - PullRequest
2 голосов
/ 10 февраля 2012

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

Например: я хочу, чтобы админ установил строку, которая будет добавляться к каждому имени пользователя.

Я думал о таблице значений (настроек), которая имеет следующие столбцы? SettingsId, Name, Value. С помощью этого метода мне нужно было бы вручную войти, создать запись Имя: AppendedToUsername, Значение: nil. Затем я бы написал методы репозитория специально для каждой настройки, которая мне нужна. Например,

public string GetAppenedToUsername()
{
    db.Settings.FirstOrDefault(s => s.Name == "AppendedToUsername").Select(s => s.Value);
}

Есть ли лучший способ создать эту базу данных?

1 Ответ

1 голос
/ 10 февраля 2012

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

Служба кэширования:

 public class CacheService
    {
        private ObjectCache Cache
        {
            get { return MemoryCache.Default; }
        }

        public object Get(string key)
        {
            return Cache[key];
        }

        public void Set(string key, object data, int cacheTime)
        {
            CacheItemPolicy policy = new CacheItemPolicy();
            policy.AbsoluteExpiration = DateTime.Now.AddMinutes(cacheTime);

            Cache.Add(new CacheItem(key, data), policy);
        }

        public bool IsSet(string key)
        {
            return (Cache[key] != null);
        }

        public void Invalidate(string key)
        {
            Cache.Remove(key);
        }
    }

Установка приложений:

public class AppSetting
{
    public const string StrSettingKey = "StrSetting";

    private CacheService CacheService { get; set; }
    private DbContext DbContext { get; set; }

    public AppSetting(ICacheService cache, DbContext db)
    {
        CacheService = CacheService;
        DbContext = db;
    }

    public string StrSetting
    {
        get
        {
            if (CacheService.IsSet(StrSettingKey))
            {
                return (string) CacheService.Get(StrSettingKey);
            }
            else
            {
                var value = DbContext.Settings.Single(s => s.Name == StrSettingKey).Select(s => s.Value);
                CacheService.Set(StrSettingKey, value, 60); //one hour
                return value;
            }

        }
        set
        {

            var item = DbContext.Settings.Single(s => s.Name == StrSettingKey);
            item.Value = value;
            DbContext.SaveChanges();
            CacheService.Set(StrSettingKey, value);

        }
    }

}
...