Pregunta

novato Autofac aquí, pero me gusta lo que veo hasta ahora. Estoy tratando de tomar ventaja de solicitud de la vida de mis objetos resueltos y estoy teniendo problemas para confirmar que está sucediendo realmente disponer luego de un pedido está hecho.

Tengo un objeto desechable que me sale en el inicio de una solicitud de página y disponer al final. Estoy usando autofac para obtener una instancia del objeto ahora y quería ver si autofac haría la eliminación para mí.

he instrumentado el método Dispose () en el objeto en cuestión, y puedo verlo 'fuego' cuando mi página hace la gestión de toda la vida. No veo ninguna evidencia cuando no lo deposite en mí mismo, pero dejo autofac hacerlo.

Estoy usando estas instrucciones para obtener thigns configurados, incluyendo el web.config y Global.asax cambios. Soy capaz de crear una instancia del objeto muy bien, pero no puedo decir si realmente está dispuesta. ¿Hay otro paso?

¿Fue útil?

Solución 3

he descubierto!

I estaba pidiendo el contenedor equivocado para la instancia de objeto - que estaba pidiendo la aplicación-contenedor para el objeto y no la solicitud-contenedor

.

D'oh!

Otros consejos

Ya sea que se deshaga el objeto manualmente dentro de la página o deja que el módulo de Autofac hacerlo, habrá una diferencia en cuando su objeto está dispuesto con respecto a la solicitud del ciclo de vida. El Autofac ContainerDisposalModule no disponer la solicitud de contenedores , y con ella su objeto, hasta que se dispara el HttpApplication.EndRequest, que es al final de la solicitud del ciclo de vida.

Dependiendo de cómo se está trazando la llamada a su método dispose objetos, podría haber una posibilidad de que no ve la salida. ¿Cómo está instrumentando el método Dispose?

Se repite la respuesta de su re-post:

  

La mayoría de las veces esto sucede (en cualquier   contenedor COI) encontrará que uno   componente a lo largo de una cadena de   dependencias es un singleton.

     

por ejemplo.

     

A -> B -> C

     

Si A es 'fábrica', es decir B 'Singleton'   y C es la 'fábrica', a continuación, la solución de una   obtendrá una referencia al Singleton   B, que siempre se hará referencia a la   misma C.

     

Para que un nuevo C para obtener creado   cada vez que se resuelva A, B deberá también   ser 'fábrica'.

Desechar no es más que una interfaz que le permite definir un método "Eliminar". El uso más común para exigir una clase desechable es si hay recursos de esa clase que debe ser liberado de forma explícita (como un mango de recursos de Windows). En su mayor parte no se requiere la interfaz IDisposable, como el recolector de basura es muy potente y va a hacer un trabajo mucho mejor en el manejo de la memoria. Sin embargo, obviamente, hay un montón de casos en los mangos deben ser liberados inmediatamente, lo que me lleva al siguiente punto, la aplicación de IDisposable.

Lo que NO debe hacer:

var myClass = MyDisposableClass();

// do stuff with myClass

myClass.Dispose();


Proper usage:

using (var myClass = MyDisposableClass())
{
    // do stuff with myClass
}

El compilador construirá efectivamente el mismo que el siguiente:

MyDisposableClass myClass = MyDisposableClass();
try
{
    // do stuff with myClass
}
finally
{
    myClass.Dispose();
}

La distinción importante es que no importa lo que pase, usted sabe que su Desechar será llamado. Además, se puede atar un destructor (que si existe, se llama por el recolector de basura) que luego se puede amarrar en llamar a su método Dispose; pero si usted necesita para hacer esto por la razón que sea, asegúrese de no liberar el mismo recurso dos veces (para establecer su punteros a NULL después de la liberación).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top