gpt4 book ai didi

c# - 从数据库和缓存中获取 AppSettings

转载 作者:太空宇宙 更新时间:2023-11-03 14:22:55 26 4
gpt4 key购买 nike

在我的办公室,我们认为我们要将 Web.Config 的 AppSettings 放入数据库中。因此,我创建了以下内容,但对代码的几个方面有一些疑问。

所以我的问题是:
UTILITY 类中包含“Cache cache = new Cache()”的行可能是错误的,因为它创建了一个新的缓存对象。

问:那么,我应该为那条线做什么?

...感谢任何帮助。

总体目标是能够像这样调用电话:

Utility.GetConfigurationValue(ConfigurationSection.AppSettings, "myVariable");

...并让它神奇地自动从缓存或数据库中检索。

实用程序代码:

public static class Utility
{
#region "Configurations"

public static String GetConfigurationValue(ConfigurationSection section, String key)
{
Configurations config = new Configurations();
Cache cache = new Cache(); // <--- This is probably wrong!!!!

if (!cache.TryGetItemFromCache<Configurations>(out config))
{
config.List(SNCLavalin.US.Common.Enumerations.ConfigurationSection.AppSettings);
cache.AddToCache<Configurations>(config, DateTime.Now.AddMinutes(15));
}

var result = (from record in config
where record.Key == key
select record).FirstOrDefault();

return (result == null) ? null : result.Value;
}

#endregion
}

扩展代码:

public static class Extensions
{
#region "System.Web.Caching"

public static void Remove<T>(this Cache cache) where T : class
{
cache.Remove(typeof(T).Name);
}
public static void AddToCache<T>(this Cache cache, object item, DateTime absoluteExpiration) where T : class
{
T outItem = null;
if (cache.TryGetItemFromCache<T>(out outItem))
return;

cache.Insert(typeof(T).Name,
item,
null,
absoluteExpiration,
System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.Normal,
null);
}
public static bool TryGetItemFromCache<T>(this Cache cache, out T item) where T : class
{
item = cache.Get(typeof(T).Name) as T;
return item != null;
}

#endregion
}

列表类代码:

public class Configurations : List<Configuration>
{
#region CONSTRUCTORS

public Configurations() : base()
{
initialize();
}
public Configurations(int capacity) : base(capacity)
{
initialize();
}
public Configurations(IEnumerable<Configuration> collection) : base(collection)
{
initialize();
}

#endregion

#region PROPERTIES & FIELDS

private Crud _crud;

#endregion

#region EVENTS
#endregion

#region METHODS

private void initialize()
{
_crud = new Crud("CurrentDbConnection");
}

public Configurations List(ConfigurationSection section)
{
using (DbCommand dbCommand = _crud.Db.GetStoredProcCommand("spa_LIST_SecConfiguration"))
{
_crud.Db.AddInParameter(dbCommand, "@Section", DbType.String, section.ToString());

_crud.List(dbCommand, PopulateFrom);
}

return this;
}

public void PopulateFrom(DataTable table)
{
this.Clear();

foreach (DataRow row in table.Rows)
{
Configuration instance = new Configuration();
instance.PopulateFrom(row);
this.Add(instance);
}
}

#endregion
}

元素等级代码:

公共(public)类配置{ #区域 build 者

public Configuration()
{
initialize();
}

#endregion

#region PROPERTIES & FIELDS

private Crud _crud;

public string Section { get; set; }
public string Key { get; set; }
public string Value { get; set; }

#endregion

#region EVENTS
#endregion

#region METHODS

private void initialize()
{
_crud = new Crud("CurrentDbConnection");
Clear();
}

public void Clear()
{
this.Section = "";
this.Key = "";
this.Value = "";
}
public void PopulateFrom(DataRow row)
{
Clear();

this.Section = row["Section"].ToString();
this.Key = row["Key"].ToString();
this.Value = row["Value"].ToString();
}

#endregion

最佳答案

您已正确识别问题 - 当前代码在每次调用 GetConfigurationValue 时创建一个新的 Cache 实例,这违背了缓存的目的。您需要将 Cache 实例设为静态,而不是每次都创建一个新实例。

public static class Utility
{
private static Cache cache = new Cache(); // Static class variable

#region "Configurations"

public static String GetConfigurationValue(ConfigurationSection section, String key)
{
Configurations config = new Configurations();
// Cache cache = new Cache(); --- removed

...
}
}

关于c# - 从数据库和缓存中获取 AppSettings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4852905/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com