asp.net mvC语言 为网站存储单一数据类型



我使用asp.net mvc。如何或在哪里存储单个数据块?如。SubscriptionFee,或IsSiteOffline

我问了一个关于用户设置的问题。我应该为网站设置做这样的事情吗?或者除了数据库之外还有其他方法吗?我希望我的用户改变这些设置从网站本身。

我将首先使用EntityFramework代码,如果我能做一些像:settings.SubscriptionFee .

最好,特别是当您希望允许用户更改这些设置时,将它们存储在任何数据存储中作为后端,如SQL或其他。

要使用这些设置,你可以把它们放在应用程序缓存中,并创建对数据存储的依赖,这样任何更新都会使缓存过期。您甚至可以为此使用静态类,但您必须自己实现管理。

通常,您将把这些设置放入Web的<appSettings>部分。配置文件。

一个标准的asp.net MVC 3应用程序已经有了一些设置(在<configuration>元素中):

  <appSettings>
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    <add key="MyCustomSetting" value="abcd1234" />
  </appSettings>
要在应用程序中引用它们,可以使用ConfigurationManager类:

using System.Configuration;

string value = ConfigurationManager.AppSettings["MyCustomSetting"];

如前所述,在你的数据后端(即SQL Server或任何你使用的)创建一个配置表并从那里获取它们可能会更好。

在我的一个(非mvc)应用程序中,我创建了一个静态SysProperties类,它将使用应用程序的缓存来保持它们的缓存至少5分钟。这个例子没有使用实体框架,但它可以很容易地适应:

public static class SysProperties
{
    public static string SMTPServer
    {
        get
        {
            return GetProperty("SMTPServer").ToString();
        }
    }
    public static decimal TicketFee
    {
        get
        {
            return Convert.ToDecimal(GetProperty("TicketFee"));
        }
    }
    private static object GetProperty(string PropertyName)
    {
        object PropertyValue = null;
        if (HttpContext.Current != null)
            PropertyValue = HttpContext.Current.Cache[PropertyName];
        if (PropertyValue == null)
        {
            SqlCommand cmSQL = new SqlCommand("SELECT Value FROM tblProperty WHERE Name = @PropertyName");
            cmSQL.Parameters.AddWithValue("@PropertyName", PropertyName);
            DataTable dt = Functions.RunSqlCommand(cmSQL);
            PropertyValue = dt.Rows[0][0];
            if (HttpContext.Current != null)
                HttpContext.Current.Cache.Insert(PropertyName, PropertyValue, null, DateTime.UtcNow.AddMinutes(5), System.Web.Caching.Cache.NoSlidingExpiration);
            return PropertyValue;
        }
        else
        {
            return PropertyValue;
        }
    }
}

注意:您可以对ConfigurationManager使用相同的技术从Web检索这些值。配置文件,而不是从数据库。

只是另一个自由,这是一些代码,我已经使用利用SQL Server的SqlCacheDependency。您必须启用SQL Server Broker,但这允许您将值缓存在内存中,直到SQL Server中的值发生更改。这样,你就不会有任意的5分钟过期。

这个函数的目的是检索具有两部分标识符的东西(比如用户的全名),所以它有三个参数:-在值没有缓存的情况下运行的SQL查询-你想要检索的项目的唯一ID(即用户ID)-识别数据类型的任意字符串(如"UserFullName", "UserEmail")

你可以很容易地调整它来检索只有一部分标识符的东西:

// Static constructor ensures that SqlDependency.Start is called before
// we try to use any SqlCacheDependencies   
static Functions()
{
    SqlDependency.Start(ConnectionString);
}
public static string GetUserFullName(string UserName)
{
    return GetSqlCachedValue("SELECT FirstName + ' ' + LastName FROM dbo.tblUser WHERE UserName = @Id", UserName, "UserFullName").ToString();
}
public static string GetEventNameFromId(int Id)
{
    return GetSqlCachedValue("SELECT EventName FROM dbo.tblEvents WHERE EventID = @Id", Id, "EventName").ToString();
}
private static object GetSqlCachedValue(string Query, object Id, string CacheName)
{
    // Get the cache
    System.Web.Caching.Cache currentCache = HttpContext.Current.Cache;
    object Value = null;
    // We use a standard naming convention for storing items in the application's cache
    string cacheKey = string.Format("{0}_{1}", CacheName, Id.ToString());
    // Attempt to retrieve the value
    if (currentCache != null && currentCache[cacheKey] != null)
        Value = currentCache[cacheKey];
    // If the value was not stored in cache, then query the database to get the value
    if (Value == null)
    {
        // Run the query provided to retrieve the value. We always expect the query to have the @Id parameter specified, that we can use
        // to plug-in the Id parameter given to this function.
        SqlCommand Command = new SqlCommand(Query);
        Command.Parameters.AddWithValue("@Id", Id);
        // Generate a cache dependency for this query
        System.Web.Caching.SqlCacheDependency dependency = new System.Web.Caching.SqlCacheDependency(Command);
        // Run the query
        DataTable dt = RunSqlCommand(Command);
        if (dt.Rows.Count == 1)
        {
            // Grab the value returned
            Value = dt.Rows[0][0];
            // Save the value in the cache, so next time we don't have to query SQL Server
            if (currentCache != null)
            {
                currentCache.Insert(cacheKey, Value, dependency);
            }
        }
    }
    // return the final value
    return Value;
}

相关内容

  • 没有找到相关文章

最新更新