5

看,我正在开发一个网站作为 MVC4 项目。该站点经常以非常简单的方式查询其数据库的各种设置:

private static T GetSetting<T>(string parameterName)
{
    return (T)Convert.ChangeType(/* bla bla SQL query code */, typeof(T));
}

合乎逻辑的问题是——到底是什么,你每次想要获得任何设置时都在查询数据库吗?如果您在某些for周期或东西中需要它怎么办?

所以我想出了缓存解决方案,我需要知道我是否尽我所能。你怎么看?

internal static void ClearCache()
{
    foreach (IDictionary cache in _caches)
        cache.Clear();
}
private static readonly HashSet<IDictionary> _caches = new HashSet<IDictionary>();
private static class TypedCache<T>
{
    private static readonly Dictionary<string, T> _cache = new Dictionary<string, T>();
    internal static Dictionary<string, T> Cache { get { return _cache; } }
}

private static T GetSetting<T>(string parameterName)
{
    T value;

    if (!TypedCache<T>.Cache.TryGetValue(parameterName, out value))
    {
        _caches.Add(TypedCache<T>.Cache);
        TypedCache<T>.Cache[parameterName] = value =
            (T)Convert.ChangeType(/* bla bla SQL query code */, typeof(T));
    }

    return value;
}

我听说 IIS 可以在内存中创建多个我的 DLL 副本(通过使用多个 IIS 进程)。顺便说一句,我怎么能强迫他只使用一个?正因为如此,我的想法可能会落入地狱。

4

2 回答 2

5

为什么不System.Web.Caching按照这个答案中描述的方式使用。

于 2012-08-02T08:08:24.673 回答
0

你应该只Convert在你想改变一个值的类型时使用,例如。将字符串转换为数字,反之亦然。在您的情况下,这些值已经具有正确的类型(我假设),因此您只需要cast

您不需要每种类型的单独字典,这不会给您带来任何好处。只需使用一个Dictionary<string, object>, 并将(不是Convert)转换为 T in GetSetting<T>

于 2012-08-02T08:03:25.113 回答