2009-07-01 31 views
1

Depuis l'implémentation par défaut de CacheManager ne fournit pas GetItemsOfType <> (et bien d'autres) je pensais de construire mon propre:Extension du blocage de la bibliothèque de l'entreprise - comment obtenir l'instance de MyCacheManager?

[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 
} 

La partie cofiguration (les points de pièce Correspà ma classe, le cryptage ISN « t utilisé):

<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> 

Le problème que je suis confronté est maintenant comment créer MyCacheManager? Le:

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

throws Exception disant qu'il n'y a pas Constructor dans MyCacheManager (mais il y a, comme dans CacheManager de EntLib seulement ils sont publics dans ma classe ...)

Répondre

2

C'est parce que MyCacheManager est pas exactement comme celui d'EntLib! Et je ne parle pas des méthodes supplémentaires. Jetez un coup d'oeil aux déclarations.

CacheManager Original:

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

MyCacheManager:

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

Autre que la différence de nom (et vous ne prolongez IDisposable), notez les attributs de type d'élément.

Vous utilisez (vous devez) le Custom. Celui personnalisé nécessite un constructeur qui prend un NameValueCollection en tant que paramètre.

public MyCacheManager(NameValueCollection collection) 

Il est un pilote de configuration générique, pour ainsi dire, et en tant que tel, il ne peut pas attendre de savoir pour créer votre instance avec un constructeur 3 paramètres se composant d'un objet cache, programmateur et minuterie poll comme vous » J'ai eu. Au lieu de cela, il transmet ces valeurs (ou tout ce que vous avez défini comme attributs dans le fichier de configuration) via une NameValueCollection de base que vous devrez analyser manuellement.

Voir aussi:
http://bloggingabout.net/blogs/dennis/archive/2009/10/22/create-a-custom-caching-manager-for-enterprise-library-4.aspx