Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 保存Asp.Net MVC 5的设置_C#_Asp.net_Asp.net Mvc_Database - Fatal编程技术网

C# 保存Asp.Net MVC 5的设置

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中存储任何这些设置 正在考虑将设置从数据库加载到应用程序缓存中 然后使用存储在应用程序缓存中的设置加载局部变量 这种方法只在每次应用

我想知道为Asp.NETMVC5C保存应用程序站点范围设置的最佳方法是什么

将在布局视图中共享的应用程序名称等设置

©DateTime.Now.Year@Website.name

我使用EF将设置存储在数据库中的名称/值对中

其他设置包括:

SMTP用户名和密码 端口设置

主题 API密钥(Twitter、Yahoo等) 和其他设置

我不想在web.config中存储任何这些设置

正在考虑将设置从数据库加载到应用程序缓存中

然后使用存储在应用程序缓存中的设置加载局部变量

这种方法只在每次应用程序重新启动时访问数据库,而不是在每次请求时

因此,大约每20分钟或更长时间,不少于20分钟

计划也使用存储库

只需要知道在应用程序加载速度、性能和安全性方面,最好的方法是什么


此外,这些设置还可以通过管理员页面进行编辑。

在我看来,您提到的是实现这一点的最佳方法

如果您有一个管理页面,那么将它们存储在数据库中似乎是一个明智的选择,并在
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);
}