2009-09-20 7 views
0

J'ai ajouté une propriété lazyloaded appelée Orders sur ma classe Customer. Pensez-vous qu'il est sage de mettre en cache les données dans un domaine privé?Est-il nécessaire de mettre en cache les données pour une propriété chargée paresseuse avec le dépôt simple Subsonic 3?

private IList<Order> _orders; 

[SubSonicIgnore] 
public IList<Order> Orders 
{ 
    get 
    { 
     if (_orders == null) 
     { 
      var repository = new SimpleRepository("MyConnectionString", SimpleRepositoryOptions.None); 
      _orders = repository.Find<Order>(x => x.CustomerId == this.CustomerId); 
     } 
     return _orders; 
    } 
} 

Ou est-il préférable de mettre en cache pas comme ceci:

[SubSonicIgnore] 
public IList<Order> Orders 
{ 
    get 
    { 
     var repository = new SimpleRepository("MyConnectionString", SimpleRepositoryOptions.None); 
     return repository.Find<Order>(x => x.CustomerId == this.CustomerId); 
    } 
} 

La raison pour laquelle je demande est parce que je pense qu'il est une bonne idée de mettre en cache les données pour l'amour de la performance, mais au En même temps, j'ai peur que la mise en cache des données ne provoque la désynchronisation d'autres processus insère/supprime des enregistrements de la base de données.

Répondre

0

Dans votre cas, vos commandes mises en cache existeront pendant toute la durée de vie de votre objet Clients. Si vous avez besoin d'effacer les commandes en cache, vous pouvez simplement requery pour votre client.

Si j'étais vous, j'ajouterais une propriété supplémentaire dont le nom spécifie qu'il y a mise en cache, ajoute un objet cacheScope personnalisé (comme transactionScope, le cache n'existe que tant que la portée existe), ou spécifiez dans la documentation quelles propriétés vont effectuer la mise en cache des objets enfants et pendant combien de temps.

Je ne supprimerais pas la mise en cache. Je le laisserais là comme une propriété supplémentaire. Vous l'aurez si vous en avez besoin.

Merci d'avoir montré votre logique de mise en cache. Voici la mienne. Dans mon cas, l'espérance de vie de mon objet parent est courte, je ne m'attends pas à plus de 100 enregistrements de données parent/enfant, et je m'attends à ce que toutes les données enfant soient utilisées. Si mes données changent, alors je devrai réadresser la logique de mise en cache que j'utilise dans cette instance particulière:

private static List<HostHeader> _cachedHostHeaders; 

public List<HostHeader> CachedHostHeaders 
{ 
    get 
    { 
     if (_cachedHostHeaders == null) 
      _cachedHostHeaders = this.HostHeaders.ToList(); 

     return _cachedHostHeaders.Where(i => i.SiteID == this.ID).ToList(); 
    } 
} 
Questions connexes