Domanda

Sto lavorando su un'applicazione asp.net-mvc. Il contesto dei dati linq viene passato nei miei oggetti di servizio dalla mappa della struttura. Ho impostato per avere un ambito di ibrido. Tutto funziona perfettamente.

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

Il problema è che continuo a gestire la memoria, mi chiedo se l'interfaccia IDisposable sia mai stata effettivamente chiamata.

Qualcuno ha qualche idea?

Se qualcuno non ha avuto altre idee su cose che potrebbero causare le mie eccezioni di memoria?

Aggiornamento:

Quindi alcune informazioni aggiuntive, ho appena inserito un paio di metodi nel mio contesto di dati e ho inserito dei punti di frenata.

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

Non sono del tutto sicuro di farlo nel modo corretto, immagino che il nuovo metodo verrà chiamato?

Comunque, nessuno dei punti di frenata è stato colpito. Tuttavia, il costruttore per la stessa classe è stato chiamato su ogni richiesta. Non ideale, sto pensando.

È stato utile?

Soluzione

Questa è quasi una copia esatta della domanda che ho posto 2 giorni fa: Sessione contenente elementi che implementano articoli IDisposable

InstanceScope.Hybrid memorizza l'oggetto all'interno di HttpContext.Current.Items se esiste o nell'archiviazione ThreadLocal altrimenti e InstanceScope.HttpSession funziona allo stesso modo diverso da come utilizza HttpSession e ThreadLocal. La raccolta degli articoli vive per richiesta, quindi se si implementa il modello indicato sulla mia domanda, si dovrebbe vedere il messaggio Dispose licenziato alla fine della richiesta corrente.

Altri suggerimenti

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

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

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

Vedremo.

Quindi la soluzione; è Cassini a causare i problemi. Fondamentalmente crea un nuovo contesto per ogni richiesta. Questo è il motivo per cui stavo vedendo il contesto creato di nuovo, sul motivo per cui non mi chiamavo usa e getta in modo corretto, non ne ho idea. Ma sono di nuovo pronto a credere che questo abbia a che fare con Cassini.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top