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とまったく同じではないためです。そして、私は余分な方法を意味するものではありません。宣言を見てください。

元のCacheManager:

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

MyCacheManager:

[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 に答える