2008-12-02 10 views
5

J'essaie de trouver un moyen de transmettre le contexte http actuel du Web à une classe de service (ou d'initialiser la classe avec une référence). Je fais ceci pour abstraire le reste de l'application d'avoir besoin de savoir quelque chose sur le contexte http. Je souhaite également que le service soit testable en utilisant TDD, probablement en utilisant l'un des frameworks Mockable. Il serait donc préférable d'utiliser une interface plutôt qu'une classe réelle.Passage du contexte Web à un 'service' dans l'application ASP MVC

Un exemple de ce que je voudrais obtenir:

class WebInstanceService 
{ 
    private IHttpContext _Context;   

    public WebInstanceService(... , IHttpContext HttpContext) 
    { 
     .... 
     _Context = HttpContext; 
    } 

    // Methods... 
    public string GetInstanceVariable(string VariableName) 
    { 
     return _Context.Current.Session[VariableName]; 
    } 
} 

L'une des principales questions que j'est qu'il n'y a pas IHttpContext, le contexte http .net est une sous-classe d'une classe abstraite qui peut Ne soyez pas moqués (facilement?).

Un autre problème est que je ne peux pas initialiser les instances globales de la classe car le contexte ne sera pas pertinent pour la plupart des requêtes.

je pouvais faire la classe statique, et exiger que le contexte à transmettre à chaque fonction comme on l'appelle plus facile à tester par exemple

public static string GetInstanceVariable(string VariableName, HttpContext Context) 
{ ... } 

mais cela ne fait pas la classe, je dois encore créer un HttpContext et en outre tous les services non-web-aware qui veulent utiliser cette classe doivent soudainement être en mesure de récupérer le contexte qui les oblige à être étroitement couplés au serveur web - la raison complète pour vouloir créer cette classe dans le premier endroit.

Je suis ouvert à TOUTES les suggestions - en particulier celles que les gens connaissent facilitent les tests de TdD. Comment les gens me suggéreraient-ils d'aborder ce problème?

Vive

Répondre

3

C'est pourquoi HttpContextBase et HttpContextWrapper ont été introduites. Vous voulez probablement utiliser HttpContextBase et lorsque vous passez le contexte réel, utilisez new HttpContextWrapper(httpContext), bien que, je pense que ce qui est disponible pour vous dans le contrôleur est déjà de type HttpContextBase. Je créerais l'un d'entre eux dans mon contrôleur à chaque fois plutôt que d'essayer de référencer le contexte actuel à partir de l'instance HttpContext.Current globale statique. Si vous en avez besoin, passez une référence à votre contexte fortement typé dans ViewData.

Je simule fréquemment HttpContextBase dans mes tests.

class WebInstanceService 
{ 
    private HttpContextBase _Context;   

    public WebInstanceService(... , HttpContextBase HttpContext) 
    { 
     .... 
     _Context = HttpContext; 
    } 

    // Methods... 
    public string GetInstanceVariable(string VariableName) 
    { 
     return _Context.Session[VariableName]; 
    } 
} 
1

ASP.NET est livré avec System.Web.Abstractions qui incluent HttpContextBase que vous pouvez utiliser pour traiter HttpContext dans une situation de test.

Je ferais abstraction personnelle de la dépendance directe sur le HttpContext.

+0

C'est exactement ce que j'essaie de faire, je ne veux pas que les services de mon application doivent s'inquiéter de l'accès à la session pour récupérer des données, je préfère qu'ils passent par la classe WebInstanceService. – Ash

+0

Je voudrais même interroger WebInstanceService. Le service doit-il savoir que cela provient du Web? –