2009-02-02 14 views
7

Estoy trabajando en una aplicación asp.net-mvc. El contexto de datos linq se pasa a mis objetos de servicio por el mapa de estructura. Tengo configurado para tener un alcance de híbrido. Todo esto funciona bien.StructureMap InstanceScope.Hybrid y IDisposable

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

El problema es que sigo corriendo nuestra memoria, me pregunto si la interfaz IDisposable es siempre realmente se llama.

¿Alguien tiene alguna idea?

¿Falló que alguien tuviera alguna otra idea para las cosas que podrían estar causando las excepciones de mi memoria?

Actualización:

Así que alguna información adicional, sólo metió un par de métodos en mi contexto de datos un freno puntos de venta en ese país.

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

No estoy muy seguro de estar haciendo esto de la manera correcta, supongo que se llamará al nuevo método?

De todos modos, ninguno de los puntos de freno se golpeó. Sin embargo, el constructor de la misma clase fue llamado en cada solicitud. No es ideal, estoy pensando.

+0

Siempre me he preguntado qué pasa con IDisposables y las diversas políticas de almacenamiento en caché. Si no encuentra nada en los documentos, adhiera puntos de interrupción en su Dispose() y vea cuándo sucede (si es que lo hace). Me interesarían las respuestas a este –

+0

¿con qué solución terminaste? Tengo una preocupación similar actual: http: // stackoverflow.com/questions/3665336/iqueryable-repository-with-structuremap-ioc-how-do-i-implement-idisposable – RPM1984

Respuesta

1

Esto es casi una copia exacta de la pregunta que hice hace 2 días: Session containing items implementing IDisposable

InstanceScope.Hybrid simplemente almacena el objeto en el interior HttpContext.Current.Items si existe o almacenamiento ThreadLocal lo contrario y InstanceScope.HttpSession funciona el De la misma manera que usa HttpSession y ThreadLocal. La colección de elementos vive por solicitud, por lo que si implementa el patrón señalado en mi pregunta, debería ver Descartar disparo al final de la solicitud actual.

+0

Estoy especialmente interesado en qué estructura está haciendo el mapa con las clases, no en lo que hace la aplicación circundante al final de su tiempo de vida. Si me equivoco, no dude en corregirme. –

+0

Excepto que no, lo verifiqué. Encontré una solución y la puse a continuación. –

+0

resulta que estaba equivocado, soy un Muppet, mis disculpas –

4

Ok por lo que la última versión del StructureMap (2.3.5) tiene un pequeño método útil llamado

HttpContextBuildPolicy.DisposeAndClearAll(); 
métodos de limpieza de conveniencia en HttpContext y ThreadLocal. HttpContextBuildPolicy.DisposeAndClearAll(), ThreadLocalStoragePolicy.DisposeAndClearAll(). Al llamar a cualquiera de los métodos, se expulsarán todas las instancias almacenadas en caché y se invocará a ID si el objeto es IDisposable.

Anteriormente los métodos de eliminación no se llamaban llamados, lo agregué a Application_EndRequest y ahora están. Espero que esto solucione algunos de mis problemas de memoria.

Ya veremos.

+0

Me preocuparía tener esto en Application_EndRequest, ya que HttpContext no existe en global.asax esto va a disparar cada solicitud de una sola página. Veo un gran potencial para los problemas de concurrencia, sin mencionar que no creo que realmente funcione correctamente ya que HttpContext no existe. –

+0

El problema que estoy teniendo es que se está creando una instancia de DataContext para cada solicitud. Puedo deshacerme de eso en cada solicitud. ¿O dejar de recrearlos, alguna idea? –

+1

Si utiliza InstanceScope.Hybrid creará un nuevo contexto para cada solicitud. Esa es la intención de Hybrid para almacenar en caché su objeto por solicitud. Si desea que dure más, consulte HttpSession o Singleton, pero tenga cuidado al mantener el contexto de datos por más tiempo. No estoy seguro de las implicaciones. –

0

Así que la solución; su Cassini causando los problemas. Básicamente, crea un nuevo contexto para cada solicitud. Es por eso que estaba viendo que el contexto se creaba de nuevo, en cuanto a por qué no me llamaba desechable apropiadamente, ni idea. Pero de nuevo estoy dispuesto a creer que esto tiene algo que ver con la Cassini.