قم بالوصول إلى إعدادات موقع الويب الخاص ب ASP.NET MVC App المخزنة في جدول قاعدة البيانات باستخدام Nibernate

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

سؤال

لدي تطبيق ASP.NET MVC الذي يعتمد على الكثير من الإعدادات (أزواج قيمة الاسم)، وأنا أخطط لتخزين هذه المعلومات في جدول قاعدة البيانات يسمى Sitesettings. هل هناك طريقة سهلة يمكنني فيها الحصول على هذه الإعدادات باستخدام Nibernate. وما هي أفضل الممارسات عند حفظ الإعدادات لتطبيق الويب. وبالتالي الإعدادات أقصد الإعدادات التي تتحكم في تدفق العمليات في تطبيق الويب والتي تحكمها قواعد العمل. هذه ليست هي إعدادات سلسلة الاتصال النموذجية. لم أتمكن من الحصول على الكثير من المعلومات على الويب على هذا الموضوع. ربما أنا لا أبحث عن الكلمات الرئيسية الصحيحة، وسيتم تقدير أي مساعدة إلى حد كبير.

هل كانت مفيدة؟

المحلول 3

لقد توصلت إلى حل مشابه تماما للواحد الذي اقترحه جيمس. انا لدي sitesettingsservice. فئة تدير الإعدادات للموقع بأكمله، ولديها تبعية بسيطة على واجهة تسمى isiteserviceRepository.. وبعد قد لا يكون هذا الحل الأكثر أناقة، لكنه يعمل تماما بالنسبة لي. لقد قمت أيضا بتكوين فئة SitesettingsService ك singleton. باستخدام الهيكلية. لذلك، ينقذني Instantiantion غير الضروري في كل مرة أحتاج فيها إلى أي إعدادات.

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

    }
}

آمل أن يساعد هذا المطورين في المستقبل على مواجهة مشاكل مماثلة. أي اقتراحات لتحسين هذا هو أكثر من موضع ترحيب.

نصائح أخرى

لا أستطيع الإجابة في سياق أحمق (الذي لا أستخدمه) أو أفضل الممارسات (جئت مع هذا بموجب بلدي مؤخرا). ومع ذلك، فإنه يعمل بشكل جيد بالنسبة لي، وربما يعمل من أجلك.

لدي جدول (BIZ_CONFIG) في قاعدة البيانات لتخزين تفضيلات الأعمال. (قمت بإنشاء قسم Web.config لما أسميه تفضيلاته.)

لدي فئة مسؤولة عن إدارة تفضيلات BIZ. يمسك المنشئ الجدول بأكمله (صف واحد لكل إعداد) ونسخ هذه في قاموس، ولديه طرق للوصول (مثل BizConfig.get ("المفتاح")) وتحديث هذا القاموس، وتحديث الجدول أيضا في نفس الوقت وبعد كما أنه يحتوي على عدد قليل من الخصائص الاختصار لقيم القاموس المحددة، خاصة حيث يجب إلقاء القيمة (لدي عدد قليل من الأرقام المهمة). انها تعمل بشكل جيد للغاية.

من أجل أن تكون أكثر كفاءة وغير مثبتة في كل مرة أحتاج فيها إلى إعداد، وأيضا الوصول إليها بسهولة من وحدات التحكم الخاصة بي وجهات نظري، قمت بإنشاء فئة ثابتة، Globals، وهي مسؤولة عن الحصول على أشياء خارج الجلسة أو التطبيق المتغيرات. بالنسبة لكائن التكوين Biz، فهو يتحقق من متغير التطبيق، وإذا خالية، يخلق واحدة جديدة. خلاف ذلك فقط إرجاعها. Globals جزء من مساحة الاسم المساعد الخاصة بي، والتي يتم تضمينها في Web.config لتكون متاحة لآرائي. حتى أتمكن من الاتصال بسهولة:

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

آمل أن يساعد هذا. إذا كنت ترغب في الكود، يمكنني حفر ذلك لك.

جوامع

إذا كان لديك مجموعة من أزواج المفتاح / القيمة، فمن المحتمل أنك تريد استخدام <map>. وبعد انظر الوثائق الرسمية lhibernate أو Ayende's Post عن 'Thbernate Mapping -u003Cmap/> '.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top