1


1

CacheManagerのデフォルト実装はGetItemsOfType <>(およびその他多数)を提供していないので、私は自分自身で構築することを考えました:

[ConfigurationElementType(typeof(CustomCacheManagerData))]
public class MyCacheManager:ICacheManager {// CacheAppBlock  -  CacheManagerと同じコンストラクタですが、ここではパブリックです。public MyCacheManager(Cache realCache、BackgroundSchedulerスケジューラ、ExpirationPollTimer pollTimer){this.realCache = realCache;} this.scheduler = scheduler; this.pollTimer = pollTimer; //他のコードは、基本的にはEntLibのCacheManagerからコピー/貼り付けして、以下のような私のメソッドのいくつかを使用したものです。public T [] GetItemsOfType(){return realCache.CurrentCacheState.Values.OfType(); //私はrealCacheの基礎となるHashtableに関する他のカスタムコードも持っています}

同時構成部分(* type *部分は私のクラスを指しています。暗号化は使用されていません):


私が今直面している問題は、MyCacheManagerをどのように作成するかです。 :

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

MyCacheManagerにはコンストラクタがないという例外がスローされます(ただし、EntLibのCacheManagerと同じように、それらは私のクラスで公開されているだけです)。

1 Answer


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)

これは、一般的な設定ドライバです。つまり、Cacheオブジェクト、スケジューラ、およびポーリングタイマーからなる3つのパラメータを持つコンストラクタを使用してインスタンスを作成することを知っていることは期待できません。 代わりに、手動で解析する必要がある基本的なNameValueCollectionを介してこれらの値(または設定ファイルで属性として設定したもの)を渡します。