Quelle est la meilleure pratique à utiliser pour le référentiel lorsque vous devez effectuer une récupération coûteuse

StackOverflow https://stackoverflow.com/questions/1631013

Question

OK, supposons que j'ai une classe DataRepository avec les méthodes getNames () et getStates (). Disons que ces données sont stockées dans un service Web ou une base de données, opération coûteuse.

une fois que la première requête est exécutée et renvoyée, lorsqu'un consommateur demande ces méthodes, il est immédiatement renvoyé car les résultats sont mis en cache dans la classe DataRepository.

Le problème est que, pour le premier appel, vous voudriez que le comportement soit asynchrone pour éviter le blocage de cet appel coûteux. Quel est le meilleur moyen de coder cela? C’est le fait que cette classe DataRepository effectue à la fois la récupération réelle inter-bornes et la mise en cache du principe de la simple respnosibilité.

d'autres réflexions sur les meilleures pratiques ici?

Était-ce utile?

La solution

  

pour le premier appel que vous souhaitez   comportement d'être asynchrone pour éviter le blocage   sur cet appel coûteux. Quel est le   meilleur moyen de coder cela?

C'est la préoccupation de l'appelant. Il est préférable de fournir des interfaces synchrones et asynchrones afin que les clients puissent choisir celle qui convient à leur situation.

  

Est-ce le fait que ce DataRepository   classe fait à la fois croix réelle   recherche et mise en cache   rompre la responsabilité unique   Principe.

Oui, le SRP est rompu si la classe de référentiel elle-même est impliquée dans la mise en œuvre de récupération et de mise en cache. De plus, le choix de la source à utiliser nécessite généralement une logique importante, ce qui constitue une autre bonne raison de séparer ces fonctions en différentes classes. (Avec l'avertissement standard: si YAGNI , ne le faites pas!)

Autres conseils

Le référentiel a-t-il vraiment la responsabilité de savoir s'il est appelé asynchrone ou non? Je penserais qu’il ferait son appel et renverrait ses données, la façon dont il est appelé n’est pas sa préoccupation. Je ne pense pas non plus que c’est sa responsabilité de stocker les données .... si vous souhaitez que les données soient stockées, l’appelant (éventuellement un intermédiaire) peut les stocker. Le référentiel devrait être assez simple .... demander des données et les renvoyer. Ou même renvoyer IQueryable et laisser le morceau qui a besoin des données obtient réellement les données ...

Si vous devez rendre le premier appel asynchrone, vous pouvez également rendre tous les appels asynchrones. Cela rendra votre code plus facile à écrire et à comprendre. Vous n'aurez pas à vous occuper de deux profils d'appel différents.

Le référentiel de données devrait être responsable d'une chose: transmettre les données à l'utilisateur. Il récupère les données d'un magasin de données. Ce magasin de données pourrait être l’appel coûteux en WS ou DB ou l’appel économique en cache. Le référentiel de données peut vérifier l'existence des données dans le cache et les renvoyer ou les extraire du WS ou de la base de données, les placer dans le cache, puis les renvoyer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top