2008-12-02 8 views
5

Ich versuche, eine Möglichkeit der Weitergabe des aktuellen Webkontexts an eine Serviceklasse (oder Initialisierung der Klasse mit einem Verweis darauf) zu erarbeiten. Ich mache das, um den Rest der App zu abstrahieren, ohne etwas über den http-Kontext wissen zu müssen.Übergeben von Webkontext zu einem "Dienst" in ASP MVC-App

Ich möchte auch den Dienst mit TDD testbar sein, wahrscheinlich mit einem der Mockable Frameworks. Daher wäre es vorzuziehen, eine Schnittstelle anstelle einer tatsächlichen Klasse zu verwenden.

Ein Beispiel dafür, was Ich mag würde erreichen:

class WebInstanceService 
{ 
    private IHttpContext _Context;   

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

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

Eine der wichtigsten Fragen ist, ich habe, dass es keine IHttpContext ist, der .net http Kontext ist eine Unterklasse einer abstrakten Klasse, wo nicht verspottet werden (leicht?).

Ein weiteres Problem ist, dass ich globale Instanzen der Klasse nicht initialisieren kann, da dann der Kontext für die meisten Anfragen nicht relevant ist.

ich die Klasse statische machen könnte, und erfordern den Kontext zu jeder Funktion übergeben werden, wie es heißt

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

genannt wird, aber dies ist nicht die Klasse machen einfacher testen, ich muss noch zu Erstellen Sie einen HttpContext, und zusätzlich müssen alle nicht webfähigen Dienste, die diese Klasse verwenden möchten, in der Lage sein, den Kontext abzurufen, der eine enge Kopplung mit dem Webserver erfordert - der ganze Grund, diese Klasse in der ersten Klasse erstellen zu wollen Ort.

Ich bin offen für alle Vorschläge - vor allem diejenigen, die Leute wissen, erleichtern einfache TDD-Tests. Wie würden die Leute vorschlagen, dass ich dieses Problem angehen?

Prost

Antwort

3

Aus diesem Grund und Httpcontextbase HttpContextWrapper eingeführt wurden. Sie möchten wahrscheinlich HttpContextBase verwenden und wenn Sie den echten Kontext übergeben, verwenden Sie new HttpContextWrapper(httpContext), obwohl ich denke, dass, was Ihnen in der Steuerung verfügbar ist, ist bereits vom Typ HttpContextBase. Ich würde jedes Mal eine davon in meinem Controller erstellen, anstatt zu versuchen, den aktuellen Kontext aus der statischen, globalen HttpContext.Current-Instanz zu referenzieren. Wenn Sie es in Ihrer Ansicht benötigen, übergeben Sie einen Verweis auf Ihren stark typisierten Kontext in ViewData.

Ich mock up HttpContextBase häufig in meinen 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 kommt mit System.Web.Abstractions, die HttpContextBase enthalten, die Sie für den Umgang mit dem HttpContext in einer Testsituation verwenden können.

Ich würde persönlich die direkte Abhängigkeit vom HttpContext abstrahieren.

+0

Dies ist genau das, was ich versuche, ich möchte nicht, dass Dienste in meiner App sich Gedanken über den Zugriff auf die Sitzung zum Abrufen von Daten machen müssen, sondern über die WebInstanceService-Klasse. – Ash

+0

Ich würde sogar WebInstanceService in Frage stellen. Muss der Dienst wissen, dass er aus dem Internet stammt? –