1

我有一个 ASP.NET MVC 应用程序,它依赖于很多设置(名称-值对),我计划将此信息存储在一个名为 SiteSettings 的数据库表中。有没有一种简单的方法可以使用 NHibernate 获取这些设置。保存 Web 应用程序设置时的最佳做法是什么。我所说的设置是指控制 Web 应用程序中的流程并受业务规则控制的设置。这些不是典型的连接字符串类型的设置。我无法在网上获得有关此主题的大量信息。也许我没有搜索正确的关键字,任何帮助将不胜感激。

4

3 回答 3

1

我无法在 nhibernate(我没有使用)或最佳实践(我最近自己提出)的上下文中回答。但是,它对我很有效,并且可能对您有用。

我在数据库中有一个表(Biz_Config)来存储业务偏好。(我创建了一个 web.config 部分,用于我称之为 IT 偏好的部分。)

我有一个班级负责管理商务偏好。构造函数抓取整个表(每个设置一行)并将它们复制到字典中,它具有访问和更新该字典的方法(例如 bizconfig.get("key")),同时也更新表. 它还具有一些用于特定字典值的快捷方式属性,尤其是在必须强制转换值的情况下(我有一些重要的数字)。它工作得很好。

为了提高效率,而不是在每次需要设置时都实例化它,也为了从我的控制器和视图中轻松访问它,我创建了一个静态类 Globals,它负责将事物从会话或应用程序中取出变量。对于 biz 配置对象,它检查应用程序变量,如果为 null,则创建一个新变量。否则它只是返回它。Globals 是我的助手命名空间的一部分,它包含在我的 web.config 中以供我的视图使用。所以我可以很容易地调用:

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

我希望这有帮助。如果你想要代码,我可以为你挖掘。

詹姆士

于 2009-07-12T11:56:25.667 回答
0

如果您有一组键/值对,您可能希望使用<map>. 请参阅NHibernate 官方文档Ayende 关于 'NHibernate Mapping - <map/>' 的帖子

于 2009-07-16T04:21:34.397 回答
0

我想出了一个与詹姆斯建议的解决方案非常相似的解决方案。我有一个SiteSettingsService类,它管理整个站点的设置,它对一个名为ISiteServiceRepository的接口有一个简单的依赖关系。这可能不是最优雅的解决方案,但它对我来说非常有效。我还使用 StructureMap 将 SiteSettingsService 类配置为Singleton。因此,每次我需要任何设置时,它都会为我节省不必要的实例化。

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

    }
}

希望这可以帮助未来面临类似问题的开发人员。任何改进这一点的建议都非常受欢迎。

于 2009-07-18T09:06:25.720 回答