2008-12-16 5 views
9

Ich verwende ADO.NET EF in einer MVC-Anwendung. Ich überlege, den ObjectContext in HttpContext.Current zu setzen, damit alle Logik in der gleichen Anfrage darauf zugreifen kann, ohne jedes Mal öffnen/zerstören zu müssen. Ich bin mir jedoch sicher, ob es eine gute Möglichkeit ist, ObjectContext-Instanzen zu verwalten. Ich habe 2 Fragen zu dieser Notwendigkeit:ADO.NET Entity Framework ObjectContext in ASP.NET MVC verwalten

  1. Als HttpContext.Current Eigenschaft von einem lokalen Thread-Feld unterstützt wird und ASP.NET verwendet Threads Pool Anfragen zu bearbeiten, ist es möglich, dass eine Object Instanz setzt in Httpcontext .Current von einer Anfrage wird für eine nachfolgende Anfrage sichtbar sein, die auf dem gleichen Thread aus dem Pool ausgeführt wird?

  2. Wie denken Sie, dass ObjectContext in ASP.NET MVC verwaltet werden sollte, um sowohl das Öffnen/Entsorgen zu vermeiden als auch Race Conditions zu vermeiden?

Antwort

1

ich mit Todd zustimmen - Verwendung DI/IoC cotnainer (Unity, Windsor) mit Pro-Thread (oder benutzerdefinierte per- Anfrage) Lebenszeit.

Ad 2, wie ich mich erinnere, in Linq zu SQL, DataContext-Objekt wurde als ein leichtes Objekt betrachtet, so sollte es kein Problem sein, es oft zu erstellen. Hoffentlich ist es ähnlich für EF.

2

Ich würde einen IoC-Container wie StructureMap verwenden, Autofac, Windosor usw.

5

Verwenden Sie die Repository pattern. Überschreiben Sie Controller.Dispose, um das Repository zu verwerfen, das wiederum den DataContext entsorgt.

0

Danke für den IoC-Vorschlag. Ich verwendete Unity und implementierte einen pro-Request Lifetime Manager zum Speichern/Abrufen von Objekten über HttpContext.Current. Scheint gut zu funktionieren.

+0

Könnten Sie möglicherweise Code schreiben, um zu zeigen, wie Sie HttpContext.Current ein Objekt hinzugefügt haben? Hast du es der Items-Sammlung hinzugefügt oder ...? – Cynthia

+0

Dies ist der Code im angepassten Lifetime Manager für Unity: HttpContext.Current.Items [key] = newValue –

2

Die Verwendung eines einzigen ObjectContext pro Anfrage ist eine gute Idee.

Wenn Sie es selbst verarbeiten, müssen Sie den Kontext in die HttpContext.Items-Auflistung einfügen. Bei EndRequest müssen Sie sicherstellen, dass der Kontext entsorgt wird.

Wie bereits erwähnt, unterstützen einige IoC-Frameworks dieses OTB - normalerweise als PerRequest-Bereich/Lebensdauer bezeichnet.

Verwandte Themen