gpt4 book ai didi

c# - 为跨多个程序集的特定类型的实例实现中央 'manager' 类

转载 作者:太空宇宙 更新时间:2023-11-03 15:30:09 25 4
gpt4 key购买 nike

在我们的软件中,我们有时会使用特定的类来缓存键和值的组合,以防止从数据库中重复检索相同的值。由于缓存实现的数量越来越多,我想集中管理所有缓存实现,并概括不同缓存类的实现。

因此,我创建了一个通用的“Cache”类,它是静态 CacheManager 类的私有(private)嵌套类。由于私有(private)嵌套 Cache 类,除 CacheManager 本身外,此类不能由任何其他类启动。

我想使用缓存管理器的原因是因为我希望能够刷新所有现金并获取所有缓存的统计信息,而不会丢失我不知道的缓存实现(由同事创建)。

ICache 接口(interface)用于将缓存公开给 CacheManager 类之外的代码。

简化的实现:

界面

// Interface for all available caches
public interface ICache<TKey, TValue>
{
bool StatisticsEnabled { get; set; }
KeyStatistics[] Statistics { get; }

// Set cache item (including update)
void Set(TKey key, TValue item);

// Get an item from the cache (return value indicates found / not found in cache)
bool Get(TKey key, out TValue value);
}

用于统计的数据对象

    // Statistics per key in the cache (or requested from the cache)
public class KeyStatistics
{
public string Name { get; set; }
public int RequestCount { get; set; }
public int HitCount { get; set; }
}

// Contains statistics per cache
public class CacheStatistics
{
public string Name { get; set; }
public KeyStatistics[] Statistics { get; set; }
}

包括通用缓存实现的静态缓存管理器

    public static class CacheManager 
{
private static Lazy<Cache<string, string>> _settingsCache = new Lazy<Cache<string, string>>();
private static Lazy<Cache<DateTime, short>> _mechanicCountCache = new Lazy<Cache<DateTime, short>>();

// actual supported caches
public static ICache<string, string> SettingsCache { get { return _settingsCache.Value; } }
public static ICache<DateTime, short> MechanicCountCache { get { return _mechanicCountCache.Value; } }

public static IEnumerable<CacheStatistics> Statistics
{
get
{
yield return new CacheStatistics
{
Name = "Settings cache",
Statistics = _settingsCache.Value.Statistics
};
yield return new CacheStatistics
{
Name = "Mechanics count cache",
Statistics = _mechanicCountCache.Value.Statistics
};
}
}

// Private class, so it cannot be initiated by anything else than the cache manager
private class Cache<TKey, TValue> : ICache<TKey, TValue>
{
private ConcurrentDictionary<TKey, KeyStatistics> _statistics = new ConcurrentDictionary<TKey, KeyStatistics>();
private ConcurrentDictionary<TKey, TValue> _cachedValues = new ConcurrentDictionary<TKey, TValue>();

// Constructor
public Cache()
{
// Do some constructing things
}

#region ICache
public bool StatisticsEnabled { get; set; }

public KeyStatistics[] Statistics
{
get { return _statistics.Values.ToArray(); }
}

public void Set(TKey key, TValue item)
{
// Todo: add to cache or update existing value

}

public bool Get(TKey key, out TValue item)
{
// Todo: fetch from dictionary
// Todo: update statistics

item = default(TValue);
return false;
}

#endregion ICache
}

这将按要求工作。但是,有些事情我还没有弄清楚。我们使用多个程序集(核心程序集和“专用”程序集)。专用程序集引用了核心程序集,但反之则不然。

我希望 CacheManager(核心程序集的一部分)能够管理来自专门程序集的 TValue 类型的缓存。我希望缓存也只能从专门的程序集中可见。我知道我不能使用部分类,我也不认为扩展会帮助我。

有没有办法实现我想要的?

最佳答案

OP 有点晚了。对于其他人来说,实现工厂模式可能是可行的方法。然后使用反射来获取通过工厂实现的所有类型,并迭代以重置所有/特定缓存。

例如 https://www.dofactory.com/net/factory-method-design-pattern

希望这对您有所帮助。

关于c# - 为跨多个程序集的特定类型的实例实现中央 'manager' 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34069759/

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