J'ai un ASP.NET MVC 3 (Rasoir) de l'Application Web, avec une page en particulier qui est très de base de données intensive, et l'expérience de l'utilisateur est de la plus grande priorité.
Ainsi, je suis l'introduction de la mise en cache sur cette page en particulier.
J'essaie de trouver un moyen de mettre en œuvre cette mise en cache modèle tout en gardant mon contrôleur mince, comme c'est le cas actuellement, sans mise en cache:
public PartialViewResult GetLocationStuff(SearchPreferences searchPreferences)
{
var results = _locationService.FindStuffByCriteria(searchPreferences);
return PartialView("SearchResults", results);
}
Comme vous pouvez le voir, le contrôleur est très mince, comme il devrait l'être. Il ne se soucie pas comment/où il est arriver c'est de l'info de - c'est le travail du service.
Quelques notes sur le flux de contrôle:
- Contrôleurs obtenir DI ed un particulier de Service, en fonction de la zone. Dans cet exemple, le contrôleur est un LocationService
-
Les Services d' appel grâce à un
IQueryable<T>
de Référentiel et d'en matérialiser les résultats enT
ouICollection<T>
.
Comment je veux mettre en œuvre la mise en cache:
-
Je ne peux pas utiliser la mise en Cache de Sortie - pour quelques raisons. Tout d'abord, cette méthode d'action est appelée à partir du côté client (jQuery/AJAX), via
[HttpPost]
, qui, selon les normes HTTP devraient pas être mis en cache comme une demande. Deuxièmement, je ne veux pas de cache purement basé sur la requête HTTP arguments - le cache logique est beaucoup plus compliqué que cela - il n'y a en fait deux niveaux de mise en cache se passe. - Comme je l'astuce ci-dessus, j'ai besoin de l'utilisation régulière des données mise en cache, l'e.g
Cache["somekey"] = someObj;
. - Je ne veux pas mettre en œuvre un générique mécanisme de mise en cache où tous les appels via le service passent par le cache en premier - je veux seulement la mise en cache sur cette méthode d'action.
La première pensée est de me créer un autre service (qui hérite LocationService), et de fournir la mise en cache des flux de travail, il (à vérifier cache en premier, si il n'y a pas d'appel db, ajouter de cache, de retour de résultat).
Qui a deux problèmes:
- Les services sont à la base des Bibliothèques de Classe - ne pas faire référence à quelque chose de supplémentaire. J'aurais besoin d'ajouter une référence à l'
System.Web
ici. - Je voudrais avoir accès au Contexte HTTP dehors de l'application web, qui est considéré comme une mauvaise pratique, non seulement pour la testabilité, mais en général - droit?
J'ai également pensé à l'aide de l' Models
le dossier de l'Application Web (que j'utilise actuellement seulement pour Viewmodel), mais avoir un service de cache dans un dossier de modèles n'a tout simplement pas l'air bon.
Donc, - des idées? Est-il un MVC-chose spécifique (comme l'Action du Filtre, par exemple) je peux utiliser ici?
Des conseils généraux ou des conseils seraient grandement appréciés.