我正在使用asp.net mvc。我如何或在何处存储单个数据?例如。 SubscriptionFee
或IsSiteOffline
。
我问了一个关于用户设置here的问题。我应该为sitesettings做这样的事情还是除了数据库之外还有其他方法?我希望我的用户从网站本身更改这些设置。
我将首先使用EntityFramework代码,如果我可以执行以下操作,我会很高兴:settings.SubscriptionFee
。
答案 0 :(得分:1)
最好,特别是因为您希望允许用户更改这些设置,将它们存储在您拥有的任何数据存储中作为后端,如SQL或其他。
要使用这些设置,您可以将它们带入应用程序缓存并创建与数据存储的依赖关系,以便任何更新都会使缓存过期。你甚至可以使用静态类,但你必须自己实现管理。
答案 1 :(得分:0)
通常,您会将这些设置放入Web.config文件的<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.config文件而不是从数据库中检索这些值。
另一个免费的,这是我用来利用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;
}