Welcome to AspAdvice Sign in | Join | Help

manik.net

alles über c# / microsoft asp.net und viel, viel mehr
Linq: DataContext in einer Web-Anwendung? Statisch? Bei jedem Aufruf? Wie denn bitte?!

Diese Frage stellt sich wohl jeder wenn man Linq-to-SQL in einer Web-Anwendung verwenden möchte. Microsoft sagt dazu folgendes: "A DataContext shoud be use per unit of work". Das heißt soviel wie, man sollte einen DataContext instanzieren für jede Arbeitseinheit die Anfällt, ich denke mal damit ist jeder INSERT/UPDATE/SELECT Befehl gemeint. Ist allerdings meiner Meinung nach etwas viel da so ein Datacontext einiges an Overhead mit sich bringt.

Also? Was machen wir dann? Lösen wir das Problem in dem wir unseren DataContext in unserer Webanwedung einfach statisch deklarieren? Nein. Das würde einiges an Problemen mit sich bringen, zum Beispiel wenn Objekte "InsertOnSubmit" markiert werden während ein "SubmitChanges" Aufruf ausgeführt wird. Aber das ist auch nur eines der *vielen* Probleme.
Die Lösung ist Simpel, wir verwenden einen DataContext für jeden Request der beim Server ankommt. Mit dieser Methode hatte ich bisher noch keine Probleme und die Last auf dem Server ist auch nicht so gigantisch, da wir den DataContext auch nur instanzieren sollten wenn er gebraucht wird. Zusammen mit der .net 3.x Spracherweiterung mit der wir Instanz-Methoden in vorhanden Klassen "injizieren" können. Die Idee ist, dass wir unseren "Per-Request-DataContext" dann über das "Request"-Objekt aufrufen können. Den passenden Codeschnipsel gibt's natürlich auch:

public static class HttpContextExtension
{
   private static object _key = new object();

   // extend HttpContext class
   public static DataContext GetDataContext(this HttpContext httpContext)
   {
      if (httpContext.Items[_key] == null)
          httpContext.Items[_key] = new DataContext();
      
      return httpContext.Items[_key] as DataContext;
   }
}

Die HttpContextExtension-Klasse sollte dann in einen Namespace der überall dort eingebunden ist, wo man auf die Context.GetDataAcessObject() Methode zugreifen möchte.
Übrigens, das "this" Schlüssel wort am ersten Parameter markiert diese statische Methode als Methode die in die klasse HttpContext injiziert wird.

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }
Sponsor
Posted: Tuesday, June 10, 2008 3:24 AM by manik
Filed under: , , , ,

Comments

No Comments

Leave a Comment

(required) 

(required) 

(optional)

(required) 

Enter the code you see below

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS