Accédez aux paramètres du site d'une application asp.net mvc stockées dans une table de base de données en utilisant NHibernate

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

Question

J'ai une application ASP.NET MVC qui dépend beaucoup de paramètres (paires nom-valeur), je prévois de stocker ces informations dans une table de base de données appelée SiteSettings. Est-il un moyen facile où je peux obtenir ces paramètres à l'aide NHibernate. Et quelles sont les meilleures pratiques lors de l'enregistrement des paramètres d'une application Web. Et par les paramètres que je veux dire les paramètres qui contrôlent le flux des processus dans l'application Web et qui sont régies par des règles commerciales. Ce ne sont pas le genre de chaîne de connexion typique des paramètres. Je ne pouvais pas obtenir beaucoup d'informations sur le web sur ce sujet. Peut-être que je ne suis pas une recherche sur les mots clés, Toute aide sera grandement appréciée.

Était-ce utile?

La solution 3

Je suis venu avec une solution qui est tout à fait semblable à celui suggéré par James. J'ai un SiteSettingsService classe qui gère les paramètres de l'ensemble du site, il a une dépendance simple sur une interface appelée ISiteServiceRepository . Cela pourrait ne pas être la solution la plus élégante, mais il fonctionne parfaitement pour moi. J'ai également configuré la classe SiteSettingsService comme Singleton en utilisant StructureMap. Alors, il me sauve instantiantion inutile chaque fois que je besoin de réglages.

//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);
        }

    }
}

Espérons que cela aide les développeurs à venir face à des problèmes similaires. Toutes les suggestions pour améliorer ce sont plus que bienvenus.

Autres conseils

Je ne peux pas répondre dans le contexte de NHibernate (que je ne suis pas à l'aide) ou les meilleures pratiques (je suis venu avec ce moi-même récemment). Cependant, cela fonctionne bien pour moi, et probablement pour vous.

J'ai une table (Biz_Config) dans la base de données pour stocker les préférences commerciales. (Je l'ai créé une section web.config pour ce que j'appelle les préférences IT.)

J'ai une classe qui est responsable de la gestion des préférences biz. Le constructeur saisit toute la table (une ligne par paramètre) et des copies de ces dans un dictionnaire, et il a des méthodes d'accès (tels que bizconfig.get ( « clé »)) et mettre à jour ce dictionnaire, la mise à jour également la table en même temps . Il a aussi quelques propriétés de raccourci pour les valeurs spécifiques du dictionnaire, en particulier lorsque la valeur doit être jeté (j'ai quelques chiffres importants). Il fonctionne très bien.

Afin d'être plus efficace et non instancier chaque fois que je besoin d'un cadre, et aussi pour y accéder facilement à partir de mes contrôleurs et points de vue, je crée une classe statique, Globals, qui est chargé de faire avancer les choses sur la variables de session ou d'application. Pour l'objet config biz, il vérifie la variable d'application et, si nul, crée un nouveau. Sinon, il retourne juste. Globals fait partie de mon espace de noms helpers, qui est inclus dans mon web.config être disponible à mon point de vue. Donc, je peux facilement appeler:

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

J'espère que cela aide. Si vous souhaitez code, je peux creuser que pour vous.

James

Si vous avez un ensemble de paires clé / valeur, vous voulez probablement utiliser un <map>. Voir documentation NHibernate officielle ou poste de Ayende sur 'NHibernate Mapping - ' .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top