2

我已经建立了一个配置系统,它将从 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]

编辑:只是为了添加更多上下文,我将添加更多代码。

这是缓存层。它本质上允许我存储多个配置。例如,我可能有一个通用应用程序配置,但我也可以获取一组使用的电子邮件。

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是因为我希望能够在不一定使用.TdynamicCacheLayerdynamic

关于我希望如何使用它的另一个例子。

List<String> EmailList = CacheLayer.Instance.Caches["EmailList"].Current;

这实际上会从 MySQL 中获取一个包含电子邮件列表的 JSON 数组。

有任何想法吗?

4

2 回答 2

2

添加新属性

public int EmailALertInterval
{
    get { return Current.EmailALertInterval; }
}
于 2012-06-10T14:48:24.157 回答
1

你有很多这样的配置,EmailAlertInterval 只是一个例子,对吧?

然后您必须更改 Caches 类,正如您已经提到的。

但是,正如您已经知道哪些缓存将进入 CacheLayer(至于我理解您的示例),您可以在那里拥有属性,例如

CacheLayer.Instance.Caches.AppConfig.EmailALertInterval

该属性处理 Current 现在所做的事情。

public T AppConfig
{
    get
    {
        if (appConfig == null)
        {
           return ReloadConfiguration();
        }

        return appConfig;
    }
}

认为应该更优雅

于 2012-06-10T14:57:57.597 回答