Sinds ik mijn applicatie volgens het lagenmodel heb opgesplitst, zit ik met een probleem:
In de middle layer heb ik veel functies die dezelfde informatie nodig hebben: UserId, Role en Language.
Omdat ik niet telkens die informatie als parameter aan mijn functies wil doorgeven zat ik te denken aan een soort van context/sessie-object waarin ik User, Role en Language informatie bewaar.
Bij webapplicaties heb je een sessie-object dat per gebruiker kan worden opgevuld. Omdat ik dit object niet kan gebruiken (het zou maar raar zijn om System.Web toe te voegen in de bovenliggende laag) had ik gedacht om een klasse te maken die er als volgt uit ziet:
Assembly: DomainLayer.dll (class library):
Assembly: WebApplication.dll (ASP.NET MVC applicatie):
Aan de hand van een cookie vul ik mijn DomainContext op bij het begin van een request:
En ik maak 'em weer leeg bij het het einde van een request:
Het probleem
Request 1 spreekt hierna nog enkele middle layer functies aan waarbij veelvuldig informatie uit DomainContext wordt uitgelezen -->omdat Request 2 dit object reeds op null heeft gezet krijg ik dus vaak NullReference exceptions.
De vraag
Hoe verhelp ik dit probleem? Ik vermoed dat ik de DomainContext-klasse thread-safe moet maken zodat verschillende requests niet met hetzelfde object zitten te werken? Maar hoe moet ik dit dan gaan gebruiken in mijn middle layer? Ik zou graag gewoon properties van DomainContext.Current blijven gebruiken aldaar...
Alvast bedankt!
In de middle layer heb ik veel functies die dezelfde informatie nodig hebben: UserId, Role en Language.
Omdat ik niet telkens die informatie als parameter aan mijn functies wil doorgeven zat ik te denken aan een soort van context/sessie-object waarin ik User, Role en Language informatie bewaar.
Bij webapplicaties heb je een sessie-object dat per gebruiker kan worden opgevuld. Omdat ik dit object niet kan gebruiken (het zou maar raar zijn om System.Web toe te voegen in de bovenliggende laag) had ik gedacht om een klasse te maken die er als volgt uit ziet:
Assembly: DomainLayer.dll (class library):
C#: DomainContext.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
| public class DomainContext { // properties public int UserId { get; set; } public List<Role> Roles { get; set; } public string Language { get; set; } /// property to get and set the current domain context public static DomainContext Current { get; set; } // constructor internal DomainContext() { } } |
Assembly: WebApplication.dll (ASP.NET MVC applicatie):
Aan de hand van een cookie vul ik mijn DomainContext op bij het begin van een request:
C#: CustomHttpModule.cs
1
2
3
4
5
6
7
8
9
| private void BeginRequest(Object source, EventArgs e) { HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; // get the domain context out of the cache via the cookie-id if (context.Request.Cookies["id"] != null) DomainContext.Current = MemcachedHelper.GetDomainContext(context.Request.Cookies["id"].Value); } |
En ik maak 'em weer leeg bij het het einde van een request:
C#: CustomHttpModule.cs
1
2
3
4
5
| private void EndRequest(Object source, EventArgs e) { // clear the domain context DomainContext.Current = null; } |
Het probleem
- Request 1 is een tijdsintensieve aanvraag (bv: database & netwerk aanvragen)
- Request 2 is een simpele request (bv: teruggeven van een tekst)
Request 1 spreekt hierna nog enkele middle layer functies aan waarbij veelvuldig informatie uit DomainContext wordt uitgelezen -->omdat Request 2 dit object reeds op null heeft gezet krijg ik dus vaak NullReference exceptions.
De vraag
Hoe verhelp ik dit probleem? Ik vermoed dat ik de DomainContext-klasse thread-safe moet maken zodat verschillende requests niet met hetzelfde object zitten te werken? Maar hoe moet ik dit dan gaan gebruiken in mijn middle layer? Ik zou graag gewoon properties van DomainContext.Current blijven gebruiken aldaar...
Alvast bedankt!