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

StackOverflow https://stackoverflow.com/questions/1113837

Вопрос

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

Это было полезно?

Решение 3

Я пришел к решению, которое очень похоже на то, которое предложил Джеймс.У меня есть Сервис настройки сайта класс, который управляет настройками для всего сайта, имеет простую зависимость от интерфейса, называемого ISiteServiceRepository - Это хранилище.Возможно, это не самое элегантное решение, но у меня оно работает идеально.Я также настроил класс SiteSettingsService как Синглтон используя 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);
        }

    }
}

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

Другие советы

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

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

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

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

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

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

Джеймс

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top