2009-02-02 17 views
7

Sto lavorando ad un'applicazione asp.net-mvc. Il contesto dati linq viene passato ai miei oggetti di servizio dalla mappa della struttura. Ho un set di ibridi. Tutto funziona perfettamente.StructureMap InstanceScope.Hybrid e IDisposable

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

Il problema è che io continuo a correre la nostra memoria, mi chiedo se l'interfaccia IDisposable è mai effettivamente chiamato.

Qualcuno ha qualche idea?

In caso contrario, qualcuno ha avuto qualche altra idea per cose che potrebbero causare le mie eccezioni di memoria?

Aggiornamento:

Quindi alcune informazioni aggiuntive, ho appena infilato un paio di metodi nel mio contesto dati un punti put freni in là.

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(); 
} 

Io non sono abbastanza sicuro che sto facendo questo il modo corretto, sto cercando di indovinare che il nuovo metodo sarà chiamato?

In ogni caso, nessuno dei punti di frenata è stato colpito. Tuttavia, il costruttore della stessa classe è stato chiamato su ogni richiesta. Non l'ideale, sto pensando.

+0

Mi sono sempre chiesto cosa succede agli IDisposables e alle varie politiche di caching. Non riuscendo a trovare nulla nei documenti, configura i punti di interruzione nel tuo Dispose() e vedi quando succede (se non del tutto). Sarei interessato alle risposte a questo –

+0

con quale soluzione hai finito? Ho una preoccupazione simile attuale: http: // StackOverflow.it/questions/3665336/iqueryable-repository-with-structuremap-ioc-how-do-i-implement-idisposable – RPM1984

risposta

1

Questo è quasi una copia esatta della questione ho chiesto 2 giorni fa: Session containing items implementing IDisposable

InstanceScope.Hybrid solo memorizza l'oggetto all'interno HttpContext.Current.Items se esiste o immagazzinamento ThreadLocal altrimenti e InstanceScope.HttpSession funziona allo stesso modo a parte che usa HttpSession e ThreadLocal. La collezione di articoli è valida per ogni richiesta, quindi se implementi il ​​modello indicato nella mia domanda dovresti visualizzare l'attivazione di Smaltire alla fine della richiesta corrente.

+0

Sono particolarmente interessato a cosa sta facendo la mappa delle strutture con le classi, non cosa fa l'applicazione circostante alla fine della sua vita. Se sbaglio, sentiti libero di correggermi. –

+0

Tranne che no, ho controllato. Ho trovato una soluzione e l'ho inserita sotto. –

+0

scopre che mi sono sbagliato, sono un Muppet le mie scuse –

4

Ok, quindi l'ultima versione di StructureMap (2.3.5) ha un metodo poco utile chiamato

HttpContextBuildPolicy.DisposeAndClearAll(); 
metodi di pulizia di convenienza su HttpContext e ThreadLocal. HttpContextBuildPolicy.DisposeAndClearAll(), ThreadLocalStoragePolicy.DisposeAndClearAll(). La chiamata di entrambi i metodi espellerà tutte le istanze memorizzate nella cache e chiamerà IDispose se l'oggetto è IDisposable.

In precedenza i metodi di smaltimento non venivano chiamati chiamati, l'ho aggiunto a Application_EndRequest e lo sono ora. Spero che questo risolva alcuni dei miei problemi di memoria.

Vedremo.

+0

Sarei preoccupato di avere questo in Application_EndRequest poiché HttpContext non esiste in global.asax questo attiverà ogni singola richiesta di pagina. Vedo un enorme potenziale per problemi di concorrenza, per non parlare del fatto che non penso che funzionerebbe correttamente poiché HttpContext non esiste. –

+0

Il problema che sto avendo è che viene creata un'istanza di DataContext per ogni richiesta. Posso liberarmene di ogni richiesta. O smettila di ricrearli, qualche idea? –

+1

Se si utilizza InstanceScope.Hybrid, verrà creato un nuovo contesto per ogni richiesta. Questa è l'intenzione di Hybrid di memorizzare nella cache l'oggetto per richiesta. Se vuoi che duri più a lungo su HttpSession o Singleton ma fai attenzione a mantenere il datacontext più a lungo non sono sicuro delle implicazioni –

0

Quindi la soluzione; il suo Cassini ha causato i problemi. Fondamentalmente crea un nuovo contesto per ogni richiesta. Questo è il motivo per cui stavo vedendo il contesto ricominciare da capo, sul motivo per cui non si trattava di chiamare "usa e getta" correttamente, non ne ho idea. Ma di nuovo sono pronto a credere che questo abbia qualcosa a che fare con Cassini.