2009-05-16 6 views
15

Je migre une application MonoRail vers ASP.NET MVC 1.0. Dans mon application d'origine, j'ai écrit un fournisseur de cache personnalisé (un fournisseur de cache distribué utilisant memcached). En monorail cette tâche a été très facile parce que le cadre utilisé des interfaces et il y a ICacheProvider qui ressemble à ceci:Comment implémenter un fournisseur de cache personnalisé avec ASP.NET MVC

public interface ICacheProvider : IProvider, IMRServiceEnabled 
{ 
    void Delete(string key); 
    object Get(string key); 
    bool HasKey(string key); 
    void Store(string key, object data); 
} 

Une instance de cette interface est disponible dans chaque action du contrôleur. Donc, tout ce que je devais faire était de mettre en œuvre un fournisseur de cache personnalisé qui utilise memcached et dire MonoRail pour utiliser mon fournisseur de cache au lieu de celui par défaut. Il était également très facile de se moquer de l'unité et de tester mon contrôleur.

Dans ASP.NET MVC 1.0, il y a l'ensemble de System.Web.Abstractions (nom semble prometteur) qui définit le HttpContextBase comme ceci:

public abstract class HttpContextBase : IServiceProvider 
{ 
    ... 
    public virtual System.Web.Caching.Cache Cache { get; } 
    ... 
} 

Je ne comprends pas comment la propriété du cache utilisé ici est un abstraction d'un fournisseur de cache. C'est l'héritage scellé Cache classe. Il semble que je ne suis pas le seul struggling to mock sur les classes dans le cadre. Je suis très nouveau dans le framework ASP.NET MVC et il me manque quelque chose ici. Je pourrais écrire un CustomBaseController qui utilise une interface ICacheProvider que je définis et tous mes contrôleurs dérivent de cette classe de base, mais s'il y a une solution plus élégante (ASP.NET MVCish), je serais heureux de l'implémenter. J'ai remarqué que HttpContextBase implémente IServiceProvider. Où est la méthode GetService va chercher des services? Peut-on facilement se moquer de cela?

Répondre

18

Cache n'a pas une abstraction officielle ou fournisseur, mais vous pouvez facilement construire un:

ASP.NET 4.0 comprend un output cache provider abstraction (AFAIK pas une abstraction générale de cache, mais seulement pour sortie mise en cache)

+3

@mausch, c'est exactement ce que j'ai fini par faire. La seule chose qui n'est pas claire à partir du premier article est comment injecter l'abstraction de cache dans le pipeline HttpContext en utilisant un IoC par exemple pour qu'il soit accessible de partout. –

+4

Je ne voudrais pas essayer de l'injecter dans HttpContext. Au lieu de cela, il suffit d'injecter votre abstraction (ICache ou quel que soit son nom) dans vos contrôleurs. –

Questions connexes