我有一个 ASP.NET MVC 应用程序,它依赖于很多设置(名称-值对),我计划将此信息存储在一个名为 SiteSettings 的数据库表中。有没有一种简单的方法可以使用 NHibernate 获取这些设置。保存 Web 应用程序设置时的最佳做法是什么。我所说的设置是指控制 Web 应用程序中的流程并受业务规则控制的设置。这些不是典型的连接字符串类型的设置。我无法在网上获得有关此主题的大量信息。也许我没有搜索正确的关键字,任何帮助将不胜感激。
3 回答
我无法在 nhibernate(我没有使用)或最佳实践(我最近自己提出)的上下文中回答。但是,它对我很有效,并且可能对您有用。
我在数据库中有一个表(Biz_Config)来存储业务偏好。(我创建了一个 web.config 部分,用于我称之为 IT 偏好的部分。)
我有一个班级负责管理商务偏好。构造函数抓取整个表(每个设置一行)并将它们复制到字典中,它具有访问和更新该字典的方法(例如 bizconfig.get("key")),同时也更新表. 它还具有一些用于特定字典值的快捷方式属性,尤其是在必须强制转换值的情况下(我有一些重要的数字)。它工作得很好。
为了提高效率,而不是在每次需要设置时都实例化它,也为了从我的控制器和视图中轻松访问它,我创建了一个静态类 Globals,它负责将事物从会话或应用程序中取出变量。对于 biz 配置对象,它检查应用程序变量,如果为 null,则创建一个新变量。否则它只是返回它。Globals 是我的助手命名空间的一部分,它包含在我的 web.config 中以供我的视图使用。所以我可以很容易地调用:
<% Globals.Biz_Config.Get("key") %>
我希望这有帮助。如果你想要代码,我可以为你挖掘。
詹姆士
如果您有一组键/值对,您可能希望使用<map>
. 请参阅NHibernate 官方文档或Ayende 关于 'NHibernate Mapping - <map/>' 的帖子。
我想出了一个与詹姆斯建议的解决方案非常相似的解决方案。我有一个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);
}
}
}
希望这可以帮助未来面临类似问题的开发人员。任何改进这一点的建议都非常受欢迎。