C# 保存Asp.Net MVC 5的设置
我想知道为Asp.NETMVC5C保存应用程序站点范围设置的最佳方法是什么 将在布局视图中共享的应用程序名称等设置 像 ©DateTime.Now.Year@Website.name 我使用EF将设置存储在数据库中的名称/值对中 其他设置包括: SMTP用户名和密码 端口设置 主题 API密钥(Twitter、Yahoo等) 和其他设置 我不想在web.config中存储任何这些设置 正在考虑将设置从数据库加载到应用程序缓存中 然后使用存储在应用程序缓存中的设置加载局部变量 这种方法只在每次应用程序重新启动时访问数据库,而不是在每次请求时 因此,大约每20分钟或更长时间,不少于20分钟 计划也使用存储库 只需要知道在应用程序加载速度、性能和安全性方面,最好的方法是什么C# 保存Asp.Net MVC 5的设置,c#,asp.net,asp.net-mvc,database,C#,Asp.net,Asp.net Mvc,Database,我想知道为Asp.NETMVC5C保存应用程序站点范围设置的最佳方法是什么 将在布局视图中共享的应用程序名称等设置 像 ©DateTime.Now.Year@Website.name 我使用EF将设置存储在数据库中的名称/值对中 其他设置包括: SMTP用户名和密码 端口设置 主题 API密钥(Twitter、Yahoo等) 和其他设置 我不想在web.config中存储任何这些设置 正在考虑将设置从数据库加载到应用程序缓存中 然后使用存储在应用程序缓存中的设置加载局部变量 这种方法只在每次应用
此外,这些设置还可以通过管理员页面进行编辑。在我看来,您提到的是实现这一点的最佳方法 如果您有一个管理页面,那么将它们存储在数据库中似乎是一个明智的选择,并在
Application\u Start
中检索它们,并将它们缓存在应用程序缓存中,这样您就不必一直查询数据库
在这里,我建议您配置IoC容器,从应用程序缓存中检索设置,然后在需要时将它们注入服务、控制器等,而不是直接引用应用程序缓存
通过这种方式,您可以相应地模拟应用程序设置,同时还可以减少对应用程序缓存要求的依赖性,以防您在将来的某个时候决定使用替代解决方案
public static class SettingsFactory
{
private const string Key = "Application.Settings";
public static ApplicationSettings Settings
{
get
{
if (HttpContext.Current.Application[Key] == null)
{
HttpContext.Current.Application[Key] = LoadSettings();
}
return HttpContext.Current.Application[Key] as ApplicationSettings;
}
}
public static ApplicationSettings LoadSettings()
{
// Return/create instance of your application settings from your database.
return new ApplicationSettings();
}
}
[Serializable]
public class ApplicationSettings
{
public string ApplicationName { get; set; }
public string ApiKey { get; set; }
}
然后在IoC容器中进行如下配置(此示例使用StructureMap):
this.For().Use(设置工厂设置);
这样,应用程序设置只在使用时创建,然后缓存在应用程序缓存中,然后从缓存中返回。我同意,将设置存储在应用程序缓存中是最好的主意。但是,我会使用从缓存中提取的属性来屏蔽静态类后面的设置,如果缓存未加载,则返回到db。例如:
public static class AppSettings
{
private static void LoadSettings
{
// This is where you would call the DB and populate the cache
}
public static string AppName
{
get
{
if (Cache["appname"] == null)
LoadSettings();
return Cache["appname"];
}
}
}
使用此实现,您可以轻松地从代码库中的任何位置调用应用程序设置,并使其按需要运行。基本上同意JoeMighty和Charlie Pugh发布的解决方案(相应地,投票结果是向上的) 进一步的两项阐述: 1) 使用缓存依赖项,您可以对删除的项进行回调以缓存结果,以便在回调中可以重新填充(而不是让第一个倒霉的用户在第一次需要该项时等待) 2) 如果您使用控制器的基本实现,您可以添加对override OnActionExecuting的调用,以将所有这些设置放入ViewBag中的已知插槽中(而不是到处污染视图模型或直接从视图访问缓存),因此。。。。差不多
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
// get the item from the cache here (anon object used as a placeholder)
this.ViewBag.settingsfromcache = new { valuex = 12234 };
// in the view you should then, consistently, be able to access "@ViewBag.settingsfromcache.valuex"
base.OnActionExecuting(filterContext);
}
诚然,我倾向于不惜一切代价避免使用ViewBag/tempData等,在某些情况下,拥有它是非常有用的。因此,在正确的路径上:),现在只是实际实现这一点的问题,你知道有任何网页提供了如何实现这一点的实际例子吗。让流程停止,现在只需要执行。令人惊讶的是,现在还没有任何Nuget软件包或框架支持这个功能。我将更新我的答案,以包括一个粗略的例子,说明我将如何处理这个问题。我知道这是一个很老的问题,但我刚刚开始解决这个问题,似乎是一个很好的解决方案。然而,我不知道如何使用缓存。我可能会在继续浏览谷歌的同时提出我自己的问题,但希望你能澄清。谢谢
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
// get the item from the cache here (anon object used as a placeholder)
this.ViewBag.settingsfromcache = new { valuex = 12234 };
// in the view you should then, consistently, be able to access "@ViewBag.settingsfromcache.valuex"
base.OnActionExecuting(filterContext);
}