Доступ к настройкам веб-сайта приложения asp.net mvc, хранящегося в таблице базы данных, с помощью NHibernate - PullRequest
1 голос
/ 11 июля 2009

У меня есть приложение ASP.NET MVC, которое зависит от множества настроек (пар имя-значение), я планирую сохранить эту информацию в таблице базы данных под названием SiteSettings. Есть ли простой способ, которым я могу получить эти настройки с помощью NHibernate. И каковы лучшие практики при сохранении настроек для веб-приложения. Под настройками я подразумеваю настройки, которые управляют потоком процессов в веб-приложении и которые регулируются бизнес-правилами. Это не типичные настройки строки подключения. Я не смог получить много информации в Интернете по этой теме. Возможно, я не ищу правильные ключевые слова, любая помощь будет принята с благодарностью.

Ответы [ 3 ]

1 голос
/ 12 июля 2009

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

У меня есть таблица (Biz_Config) в базе данных для хранения бизнес-предпочтений. (Я создал раздел web.config для того, что я называю настройками ИТ.)

У меня есть класс, который отвечает за управление настройками бизнеса. Конструктор захватывает всю таблицу (по одной строке на настройку) и копирует их в словарь, и у него есть методы для доступа (например, bizconfig.get ("key")) и обновления этого словаря, одновременно обновляя таблицу , У этого также есть несколько свойств быстрого доступа для определенных значений словаря, особенно, где значение должно быть приведено (у меня есть несколько важных чисел). Работает довольно хорошо.

Чтобы быть более эффективным и не создавать его каждый раз, когда мне нужна настройка, а также для легкого доступа к ней из моих контроллеров и представлений, я создал статический класс, Globals, который отвечает за извлечение вещей из переменные сеанса или приложения. Для объекта конфигурации biz он проверяет переменную приложения и, если имеет значение null, создает новую. В противном случае он просто возвращает его. Globals является частью моего пространства имен помощников, которое включено в мой web.config, чтобы быть доступным для моих просмотров. Так что я могу легко позвонить:

<% Globals.Biz_Config.Get("key") %>

Надеюсь, это поможет. Если вам нужен код, я могу откопать его для вас.

Джеймс

0 голосов
/ 18 июля 2009

Я придумала решение, очень похожее на предложенное Джеймсом. У меня есть класс SiteSettingsService , который управляет настройками всего сайта, он имеет простую зависимость от интерфейса, называемого ISiteServiceRepository . Возможно, это не самое элегантное решение, но оно отлично работает для меня. Я также настроил класс SiteSettingsService как Singleton , используя StructureMap. Таким образом, это избавляет меня от ненужных инстанций каждый раз, когда мне нужны какие-либо настройки.

//ISiteServiceRepository, an implementation of this uses NHibernate to do just two things
//i)Get all the settings, ii)Persist all the settings
using System.Collections.Generic;
using Cosmicvent.Mcwa.Core.Domain.Model;

namespace Cosmicvent.Mcwa.Core.Domain {
    public interface ISiteServiceRepository {
        IList<Setting> GetSettings();
        void PersistSettings(IDictionary<string, string> settings);
    }
}

//The main SiteSettingsService class depends on the ISiteServiceRepository
using System;
using System.Collections.Generic;
using Cosmicvent.Mcwa.Core.Domain;
using Cosmicvent.Mcwa.Core.Domain.Model;

namespace Cosmicvent.Mcwa.Core.Services {
    public class SiteSettingsService : ISiteSettingsService {

        private readonly ISiteServiceRepository _siteServiceRepository;
        private IDictionary<string, string> _settings;

        public SiteSettingsService(ISiteServiceRepository siteServiceRepository) {
            _siteServiceRepository = siteServiceRepository;
            //Fill up the settings
            HydrateSettings();
        }


        public int ActiveDegreeId {
            get {
                return int.Parse(GetValue("Active_Degree_Id"));
            }
        }

        public string SiteTitle {
            get { return GetValue("Site_Title"); }
        }

        public decimal CounsellingFee {
            get { return decimal.Parse(GetValue("Counselling_Fee")); }
        }

        public decimal TuitionFee {
            get { return decimal.Parse(GetValue("Tuition_Fee")); }
        }

        public decimal RegistrationFee {
            get { return decimal.Parse(GetValue("Registration_Fee")); }
        }

        public void UpdateSetting(string setting, string value) {
            if (!string.IsNullOrEmpty(setting) && !string.IsNullOrEmpty(value)) {
                SetValue(setting, value);
                PersistSettings();
            }
        }

        //Helper methods
        private void HydrateSettings() {
            _settings = new Dictionary<string, string>();
            IList<Setting> siteRepoSettings = _siteServiceRepository.GetSettings();
            if (siteRepoSettings == null) {
                throw new ArgumentException("Site Settings Repository returned a null dictionary");
            }
            foreach (Setting setting in siteRepoSettings) {
                _settings.Add(setting.Name.ToUpper(), setting.Value);
            }
        }

        private string GetValue(string key) {
            key = key.ToUpper();
            if (_settings == null) {
                throw new NullReferenceException("The Site Settings object is Null");
            }
            if (!_settings.ContainsKey(key)) {
                throw new KeyNotFoundException(string.Format("The site setting {0} was not found", key));
            }
            return _settings[key];
        }

        private void SetValue(string key, string value) {
            key = key.ToUpper();
            if (_settings == null) {
                throw new NullReferenceException("The Site Settings object is Null");
            }
            if (!_settings.ContainsKey(key)) {
                throw new KeyNotFoundException(string.Format("The site setting {0} was not found", key));
            }

            _settings[key] = value;
        }

        private void PersistSettings() {
            _siteServiceRepository.PersistSettings(_settings);
        }

    }
}

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

0 голосов
/ 16 июля 2009

Если у вас есть набор пар ключ / значение, вы, вероятно, захотите использовать <map>. См. официальную документацию NHibernate или пост Айенде о 'NHibernate Mapping -

.

...