2013-05-29 27 views
5

In un # progetto ASP.NET MVC C:Aggiungi classe personalizzata al HttpContext

Attualmente sto usando HttpContext.Items per memorizzare una proprietà che dovrebbe essere utilizzato ovunque in tale richiesta. Questo è quello che ho nel controller:

HttpContext.Items["IUser"] = new CustomClass(“parameter”); 

Questo funziona bene per recuperare la vista dal momento che sto ignorando il WebViewPage di default in questo modo nel file web.config vista:

<pages pageBaseType="Project.CustomWebViewPage"> 

all'interno del CustomWebViewPage creo una proprietà e impostarlo nel InitHelpers() metodo come questo:

IUser = (CustomClass)HttpContext.Current.Items["IUser"]; 

Tuttavia, se voglio recuperarlo nei miei modelle/ViewModels Dovrò mettere quel codice pezzo di codice ovunque, e quindi ho pensato di creare invece CustomClass direttamente all'interno di HttpContext (quindi almeno non dovrò digitare typecasting), ma non riesco a trovare come fare override o aggiungere dinamicamente quell'oggetto.

risposta

9

È possibile creare un metodo di estensione. Qualcosa di simile a questo:

public static class HttpContextExtensions 
{ 
    public static CustomClass GetUser(this HttpContextBase context) 
    { 
     return (CustomClass)context.Items["IUser"]; 
    } 
} 

allora si sarebbe chiamare in questo modo:

var user = HttpContext.Current.GetUser(); 
5

Recentemente ho affrontato un problema simile. Mentre ho lavorato con WebForms, la mia soluzione dovrebbe valere anche per MVC.

Ho creato un nuovo oggetto per accedere ai livelli DAL/Business Logic per ogni richiesta. Ciò mi consente di apportare modifiche alla logica, indipendentemente dalla durata della richiesta o in caso di più richieste eseguite contemporaneamente. Inoltre ha permesso di garantire la disponibilità del mio oggetto al termine della richiesta.

Il mio primo pensiero è stato quello di creare un'implementazione personalizzata di HttpContextBase, ma non sono riuscito a trovare alcun modo per sovrascrivere la creazione dello HttpContext per la richiesta.

Così alla fine ho introdotto un metodo di estensione che racchiude in sé tutta la logica:

public static class HttpContextExtensions 
{ 
    public static CustomClass GetIUser(this HttpContextBase Context) 
    { 
     return Context.Items["IUser"] as CustomClass; 
    } 
} 

Ora il codice semplifica a:

var user = Request.RequestContext.HttpContext.GetIUser();