Accedere alle impostazioni del sito web di un app MVC asp.net memorizzati in una tabella del database utilizzando NHibernate

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

Domanda

Ho un app ASP.NET MVC, che dipende da un sacco di impostazioni (coppie nome-valore), ho intenzione di memorizzare queste informazioni in una tabella di database chiamato SiteSettings. C'è un modo semplice in cui posso ottenere queste impostazioni utilizzando NHibernate. E quali sono le migliori pratiche durante il salvataggio delle impostazioni per un'applicazione Web. E dalle impostazioni intendo le impostazioni che controllano il flusso dei processi in applicazioni web e che sono disciplinate dalle regole di business. Questi non sono il tipico tipo stringa di connessione di impostazioni. Sono stato in grado di ottenere molte informazioni sul web su questo argomento. Forse non sto cercando sulle parole chiave giuste, Ogni aiuto sarà molto apprezzato.

È stato utile?

Soluzione 3

Sono venuto su con una soluzione che è molto simile a quello proposto da James. Ho un SiteSettingsService di classe che gestisce le impostazioni per l'intero sito, ha una semplice dipendenza da un'interfaccia chiamata ISiteServiceRepository . Questo potrebbe non essere la soluzione più elegante, ma è perfettamente funzionante per me. Ho anche configurato la classe SiteSettingsService come Singleton utilizzando StructureMap. Quindi, mi salva instantiantion inutile ogni volta che ho bisogno di alcuna impostazione.

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

    }
}

Spero che questo aiuti futuri sviluppatori che affrontano problemi simili. Eventuali suggerimenti per migliorare questo sono più che benvenuti.

Altri suggerimenti

Non posso rispondere nel contesto di NHibernate (che non sto usando) o le migliori pratiche (sono arrivato fino a questo da solo di recente). Tuttavia, funziona bene per me, e probabilmente funzionerà per voi.

Ho una tabella (Biz_Config) nel database per memorizzare le preferenze commerciali. (Ho creato una sezione web.config per quello che io chiamo preferenze IT.)

Ho una classe che ha il compito di gestire le preferenze biz. Il costruttore afferra l'intera tabella (una riga per impostazione) e li copia in un dizionario, e ha metodi di accesso (come bizconfig.get ( "key")) e aggiornare questo dizionario, anche l'aggiornamento della tabella contemporaneamente . Essa ha anche un paio di proprietà di scelta rapida per specifici valori del dizionario, in particolare in cui il valore deve essere gettato (ho un paio di numeri importanti). Funziona abbastanza bene.

Al fine di essere più efficienti e non un'istanza ogni volta che ho bisogno di un ambiente, e anche di accedervi facilmente da miei regolatori e punti di vista, ho creato una classe statica, Globals, che si occupa di ottenere le cose fuori dal di sessione o di applicazione variabili. Per l'oggetto biz config, controlla la variabile di applicazione e, se nulla, ne crea uno nuovo. In caso contrario, solo lo restituisce. Global fa parte della mia aiutanti namespace, che è incluso nel mio web.config per essere a disposizione dei miei punti di vista. Così posso facilmente chiamare:

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

Spero che questo aiuta. Se vuoi codice, posso scavare che per voi.

James

Se si dispone di un insieme di coppie chiave / valore, probabilmente si desidera utilizzare un <map>. Vedere la documentazione ufficiale di NHibernate o post di Ayende su 'NHibernate Mapping - ' .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top