2013-05-29 21 views
5

W projekcie ASP.NET MVC C#:Dodaj niestandardową klasę HttpContext

obecnie używam HttpContext.Items do przechowywania mienia, które powinny być używane wszędzie w tym wniosku. To jest to, co mam w kontrolerze:

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

to działa prawidłowo pobierać w widoku ponieważ jestem nadpisanie domyślnego WebViewPage jak to w pliku web.config odsłon:

<pages pageBaseType="Project.CustomWebViewPage"> 

wewnątrz CustomWebViewPage utworzyć właściwość i ustawić go w InitHelpers() metodę tak:

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

Jednakże, jeśli chcę je odzyskać w moich models/ViewModels Będę musiał umieścić ten kodowy kawałek kodu wszędzie, dlatego pomyślałem o stworzeniu CustomClass bezpośrednio w HttpContext (więc przynajmniej nie będę musiał kłaniać się za typowaniem), ale nie jestem w stanie znaleźć sposobu na zastąpienie lub dynamicznie dodawaj do niego ten obiekt.

Odpowiedz

9

Można utworzyć metodę rozszerzenia. Coś takiego:

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

Wtedy to nazwać tak:

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

ja niedawno do czynienia z podobnym problemem. Podczas gdy pracowałem z WebForms, moje rozwiązanie powinno również mieć zastosowanie do MVC.

Utworzono nowy obiekt, aby uzyskać dostęp do warstw DAL/Business Logic dla każdego żądania. Pozwala mi to na dokonywanie zmian w logice, bez względu na to, jak długo trwa żądanie lub czy równolegle wykonywanych jest wiele żądań. Pozwoliło to również na usunięcie mojego obiektu po zakończeniu żądania.

Moją pierwszą myślą było stworzenie niestandardowej implementacji HttpContextBase, ale nie mogłem znaleźć żadnego sposobu na zastąpienie utworzenia HttpContext dla żądania.

Więc w końcu wprowadził metodę rozszerzenia, która zamyka całą logikę:

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

Teraz kod upraszcza się do:

var user = Request.RequestContext.HttpContext.GetIUser(); 
Powiązane problemy