1

由于 CacheManager 的默认实现不提供 GetItemsOfType<> (以及许多其他),我想构建自己的:

[ConfigurationElementType(typeof(CustomCacheManagerData))]
public class MyCacheManager : ICacheManager
{
    //The same constructor as in CacheAppBlock - CacheManager, but it's public here:
    public MyCacheManager(Cache realCache, BackgroundScheduler scheduler, ExpirationPollTimer pollTimer)
    {
       this.realCache = realCache;
       this.scheduler = scheduler;
       this.pollTimer = pollTimer;
    }
    //the other code is basically copy/paste from CacheManager in EntLib, with some of my methods like:
    public T[] GetItemsOfType<T>()
    {
        return realCache.CurrentCacheState.Values.OfType<T>().ToArray();
    }
    //I also have some other custom code on the underlying Hashtable in realCache
}

配置部分(类型部分指向我的类,不使用加密):

<cachingConfiguration defaultCacheManager="SomeCacheManager">
    <cacheManagers>
      <add expirationPollFrequencyInSeconds="60" maximumElementsInCacheBeforeScavenging="1000"
        numberToRemoveWhenScavenging="10" backingStoreName="Null Storage"
        type="MyNamespace.MyCacheManager, MyNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
        name="SomeCacheManager" />
</cacheManagers>
    <backingStores>
      <add encryptionProviderName="" type="Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.NullBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        name="Null Storage" />
    </backingStores>
  </cachingConfiguration>

我现在面临的问题是如何创建 MyCacheManager?这:

mCityCacheManager = (MyCacheManager)CacheFactory.GetCacheManager("SomeCacheManager");

抛出异常说 MyCacheManager 中没有构造函数(但是与 EntLib 的 CacheManager 相同,只是它们在我的班级中是公开的......)

4

1 回答 1

2

那是因为MyCacheManager它与 EntLib 不完全一样!我不是指额外的方法。看看声明。

原始缓存管理器:

[ConfigurationElementType(typeof(CacheManagerData))]
public class CacheManager : IDisposable, ICacheManager

我的缓存管理器:

[ConfigurationElementType(typeof(CustomCacheManagerData))]
public class MyCacheManager : ICacheManager

除了名称不同(并且您没有扩展 IDisposable)之外,请注意元素类型属性。

您正在使用(必须)自定义。自定义的需要一个以 NameValueCollection 作为参数的构造函数。

public MyCacheManager(NameValueCollection collection)

可以这么说,它是一个通用的配置驱动程序,因此不能期望它知道使用 3 参数构造函数创建您的实例,该构造函数由缓存对象、调度程序和轮询计时器组成,就像您拥有的那样。相反,它通过您必须手动解析的基本 NameValueCollection 传入这些值(或您在配置文件中设置为属性的任何值)。

另请参阅:
http ://bloggingabout.net/blogs/dennis/archive/2009/10/22/create-a-custom-caching-manager-for-enterprise-library-4.aspx

于 2010-04-30T20:48:41.973 回答