我已经建立了一个配置系统,可以从MySQL数据库中获取配置。我已经有了它的工作,但现在我意识到要从缓存中获取值,我必须使用这个冗长的代码。
CacheLayer.Instance.Caches["app_config"].Current.EmailALertInterval
我想删除Current
,但我还没弄清楚是否有可能让这个类直接执行此操作。目前实现看起来像这样。
public T Current
{
get
{
if (_current == null)
{
ReloadConfiguration();
}
return _current;
}
}
但我想简单地说:
CacheLayer.Instance.Caches["app_config"].EmailALertInterval
我正在看这样的事情,但这只适用于索引器。
public T this[T key]
编辑:只是为了添加更多上下文,我将添加更多代码。
这是CacheLayer。它基本上允许我存储多个配置。我可能有一个例如通用应用程序配置,但我也可以获取使用的电子邮件数组。
public Dictionary<String,IGenericCache<dynamic>> Caches
{
get
{
return _caches;
}
}
public void AddCache(String config)
{
_caches.Add(config,new GenericCache<dynamic>(config));
}
在我的GenericCache中,我使用存储在MySQL数据库中的JSON字符串加载配置。
_current = JsonConvert.DeserializeObject<T>(db.dbFetchConfig(config));
GenericConfig
为T
而不是dynamic
的原因是因为我希望能够在CacheLayer
之外进行自定义细分,不一定使用dynamic
。
关于我希望如何使用它的另一个例子。
List<String> EmailList = CacheLayer.Instance.Caches["EmailList"].Current;
这实际上是从MySQL中获取一个包含电子邮件列表的JSON数组。
有什么想法吗?
答案 0 :(得分:2)
添加新属性
public int EmailALertInterval
{
get { return Current.EmailALertInterval; }
}
答案 1 :(得分:1)
你有很多这些配置,而EmailAlertInterval只是一个例子,对吗?
然后你必须改变Caches类,正如你已经提到的那样。
但是,正如您已经知道哪些Caches将进入CacheLayer(就我理解您的示例而言),您可以在那里拥有属性,例如。
CacheLayer.Instance.Caches.AppConfig.EmailALertInterval
该属性处理Current现在所做的事情。
public T AppConfig
{
get
{
if (appConfig == null)
{
return ReloadConfiguration();
}
return appConfig;
}
}
认为应该更优雅