2009-02-02 6 views
7

Je travaille sur une application asp.net-mvc. Le contexte de données linq est passé dans mes objets de service par la structure de mappe. Je dois avoir une portée d'hybride. Tout cela fonctionne très bien.StructureMap InstanceScope.Hybrid et IDisposable

protected override void configure() 
{ 
    ForRequestedType<AetherDataContext>() 
     .TheDefaultIs(() => new AetherDataContext()) 
     .CacheBy(InstanceScope.Hybrid); 
} 

Le problème est que je continue à courir notre mémoire, je me demande si l'interface IDisposable est jamais réellement appelé.

Vous avez des idées?

A défaut que quelqu'un ait eu une autre idée de choses qui pourraient causer des exceptions à ma mémoire?

Mise à jour:

donc quelques informations supplémentaires, je viens farcie deux méthodes dans mon contexte de données un des points de freinage mis là-dedans.

protected override void Dispose(bool disposing) 
{ 
    Debug.WriteLine("Disposing: " + DateTime.Now); 
    base.Dispose(disposing); 
} 

public new void Dispose() 
{ 
    Debug.WriteLine("Disposing: " + DateTime.Now); 
    base.Dispose(); 
} 

Je ne suis pas tout à fait sûr que je fais cela la bonne façon, je devine que la nouvelle méthode sera appelée?

De toute façon, aucun des points de freinage n'a été touché. Cependant, le constructeur de la même classe a été appelé à chaque demande. Pas idéal je pense.

+0

Je me suis toujours demandé ce qui arrivait à IDisposables et aux différentes politiques de mise en cache. A défaut de trouver quoi que ce soit dans les documents, collez des points d'arrêt dans votre Dispose() et voyez quand cela arrive (voire pas du tout). Je serais intéressé par les réponses à cette question –

+0

quelle solution avez-vous fini par aller avec? J'ai une préoccupation similaire actuelle: http: // stackoverflow.com/questions/3665336/iqueryable-repository-avec-structemap-ioc-how-do-i-implement-idisposable – RPM1984

Répondre

1

Ceci est presque une copie exacte de la question que je posais il y a 2 jours: Session containing items implementing IDisposable

InstanceScope.Hybrid juste stocke l'objet à l'intérieur HttpContext.Current.Items si elle existe ou le stockage ThreadLocal autrement et InstanceScope.HttpSession fonctionne la de la même manière, à part qu'il utilise HttpSession et ThreadLocal. La collection d'éléments vit par requête, donc si vous implémentez le motif indiqué sur ma question, vous devriez voir Disposer le tir à la fin de la requête en cours.

+0

Je m'intéresse spécifiquement à ce que fait la structure map avec les classes, pas à ce que fait l'application environnante à la fin de sa vie. Si je me trompe, n'hésitez pas à me corriger. –

+0

Sauf que non, j'ai vérifié. J'ai trouvé une solution et je l'ai collée ci-dessous. –

+0

s'avère que je me trompais, je suis un Muppet mes excuses –

4

Ok, donc la dernière version de StructureMap (2.3.5) a une méthode peu utile appelé

HttpContextBuildPolicy.DisposeAndClearAll(); 
méthodes pratiques de nettoyage sur HttpContext et ThreadLocal. HttpContextBuildPolicy.DisposeAndClearAll(), ThreadLocalStoragePolicy.DisposeAndClearAll(). L'appel de l'une ou l'autre méthode éjectera toutes les instances mises en cache et appellera IDispose si l'objet est IDisposable.

Auparavant, les méthodes d'élimination n'étaient pas appelées appelées, j'ai ajouté cela à Application_EndRequest et elles sont maintenant. J'espère que cela va résoudre certains de mes problèmes de mémoire.

Nous verrons.

+0

Je serais préoccupé de l'avoir dans Application_EndRequest puisque HttpContext n'existe pas dans global.asax ce sera le déclenchement de chaque demande de page unique. Je vois un énorme potentiel pour les problèmes de simultanéité, sans mentionner que je ne pense pas que cela fonctionnerait correctement puisque le HttpContext n'existe pas. –

+0

Le problème que je rencontre est qu'une instance de DataContext est en cours de création pour chaque requête. Je peux soit m'en débarrasser à chaque demande. Ou arrêter de les recréer, des idées? –

+1

Si vous utilisez InstanceScope.Hybrid, il créera un nouveau contexte pour chaque requête. C'est l'intention de Hybrid de mettre en cache votre objet par requête. Si vous voulez que cela dure plus longtemps, regardez HttpSession ou Singleton mais faites attention à garder le datacontext plus longtemps je ne suis pas sûr des implications –

0

Donc la solution; son Cassini causant les problèmes. Fondamentalement, il crée un nouveau contexte pour chaque demande. C'est pourquoi je voyais le contexte être créé à nouveau, pour savoir pourquoi il ne m'appelait pas jetable correctement, je ne sais pas. Mais encore une fois je suis prêt à croire que c'est quelque chose à voir avec Cassini.