La raison pour laquelle je demande est parce que la collection HttpContext.Current.Items
semble être un bon endroit pour mettre IDisposable
objets tels qu'un DataContext
de sorte qu'un référentiel puisse y accéder de manière transparente sans avoir à injecter des dépendances liées à une technologie ORM spécifique dans le Dépôt. Cela permettrait également au référentiel de décider s'il doit ou non s'engager dans un UnitOfWork
ou assumer la responsabilité supplémentaire de la persistance de tout changement.Le HttpContext.Current est-il éliminé même si une exception est levée?
Par exemple:
Le Page:
protected void Page_Load(...)
{
Items[KeyValueFromConfigurationFile] = new DataContext();
var repo = new Repository();
var rootEntity = repo.GetById(1);
}
Le dépôt:
public virtual TEntity GetById(int id)
{
var ctx = HttpContext.Current.Items[KeyValueFromConfigurationFile] as DataContext;
return ctx.TEntities.SingleOrDefault(p => p.Id == id);
}
Bien sûr, je vérifierais pour nulls et effectuer les étapes nécessaires pour obtenir un DataContext
si elle n'était pas disponible dans la collection HttpContext.Current.Items
.
Donc, retour à ma question d'origine donnée le code ci-dessus: Est-ce que le HttpContext.Current
sera-t-il disposé avec l'un des objets contenus dans sa collection d'articles même si une exception est levée?
Merci, cela fonctionne. Une chose que les gens devraient noter est la fréquence à laquelle EndRequest est déclenché. Dans ce fil http://www.mojoportal.com/Forums/Thread.aspx?pageid=5&t=1558~-1. Le serveur Web Visual Studio déclenche cet événement pour toutes les demandes HTTP (y compris les images, css, etc), tandis que IIS se déclenche uniquement pendant les pages gérées .NET. Gardez cela à l'esprit si vous déboguez dans VS Web Server et que vous voyez l'événement se déclencher encore et encore. –
'foreach (var v dans HttpContext.Current.Items.Values.OfType()) v.Dispose();' –
Denis