2012-02-23 8 views
4

J'ai commencé à utiliser Azure AppFabric Caching Service avec succès, mais je ne suis pas certain de la meilleure façon de créer l'objet DataCacheFactory. Maintenant, je le crée pour chaque appel dans le cache, mais apparemment ce n'est pas la façon idéale de le faire ...Meilleure pratique lors de l'utilisation d'Azure AppFabric Caching Service?

Certains conseillent d'appeler un singleton. Mais je ne suis pas sûr de comprendre comment cela serait mis en œuvre (pas la classe Singleton, mais comment lier tout cela ensemble).

Aujourd'hui, j'ai une classe CacheProvider qui est créée pour moi en utilisant Ninject où je peux faire des opérations Get/Put/Remove. Pour chacune de ces méthodes, je crée l'objet DataCacheFactory, puis appelle .GetDefaultCache() pour obtenir l'objet DataCache, où j'appelle respectivement Put/Get/Remove. Je le fais dans une seule méthode qui ressemble à ceci:

private T Cache<T>(Func<DataCache, T> cacheAction) 
{ 
    using (DataCacheFactory dataCacheFactory = new DataCacheFactory()) 
    { 
     DataCache dataCache = dataCacheFactory.GetDefaultCache(); 
     return cacheAction(dataCache); 
    } 
} 

Je suis maintenant assez sûr que ce soit pas si-idée intelligente, je place obtiendrais l'objet DataCache par un Singleton où le DataCacheFactory l'objet est juste créé une fois. MAIS comment cet objet survivra-t-il entre les demandes? Et comment cela fonctionne-t-il avec> 1 instance sur Azure?

J'espère que tout cela a du sens et que quelqu'un avec plus d'expérience que moi (3 heures) peut m'aider.

+0

Voir méthode CacheUtil.GetCache de http://www.hanselman.com/blog/InstallingConfiguringAndUsingWindowsServerAppFabricAndTheVelocityMemoryCacheIn10Minutes.aspx –

Répondre

6

Les objets Singleton résident dans la portée de l'application. Déclarez simplement votre objet DataCache privé à un niveau statique global, fournissez une propriété Get qui instancie l'objet s'il est null ou renvoie l'objet s'il n'est pas null. De cette façon, vous paierez le coût de l'instrumentation de la configuration et de la connexion du cache une seule fois par recyclage d'application.

Chaque instance va instancier son propre objet DataCache et c'est OK.

Les données réelles, où le cache est stocké, ne sont pas stockées dans la mémoire de votre ordinateur local, mais dans les serveurs de cache dédiés d'Azure qui sont distribués et méga-rapides.

+0

je voudrais ajouter que chaque instance de l'DataCacheFactory compte comme l'une des connexions dans votre quota de cache, donc en utilisant un singleton C'est vraiment une bonne idée. Les données peuvent également rester en mémoire si vous avez activé la mise en cache locale. – knightpfhor

+0

Ça sonne bien. J'ai déjà changé mon code pour cette approche et il semble fonctionner comme prévu. Dommage que Microsoft ne le montre pas dans les docs, cela aurait été tellement plus facile de l'implémenter correctement alors ... Merci! – noocyte

+0

Dans un webrole Azure MVC 3, cela signifierait-il de le décaler dans le fichier Global.asax.cs? – NER1808

Questions connexes