2011-02-08 9 views
6

Me gustaría explícitamente "liberar" una instancia de objeto resuelta por Unity. Esperaba que el método de desmontaje se debe utilizar exactamente por esto por lo que intentó hacer algo como esto:¿Qué debería hacer el método UnityContainer.Teardown?

container.RegisterType(typeof(IMyType), typeof(MyType), 
    new MyLifetimeManager()); 
var obj = container.Resolve<IMyType>(); 
... 
container.Teardown(obj); 

MyLifetimeManager tiendas instancia de objeto en HttpContext.Current.Items. Esperé que el método Teardown llame al RemoveValue en el administrador de por vida y libere la instancia MyType y la instancia del administrador de por vida. No funciona En primer lugar, no se llama al RemoveValue y si vuelvo a llamar al Resolve<IMyType> obtendré una instancia previamente resuelta.

¿Qué debería hacer el método Teardown? ¿Cómo puedo liberar un objeto a pesar de su administrador de por vida?

Editar:

Si Teardown no libera la instancia, que lo haga? ¿Quién llama al RemoveValue en el administrador de por vida?

+0

mirando el vago "lo limpia" comentario en MSDN, estoy asumiendo TearDown devuelve un objeto prístino, como si estuviera recién creado. – Massif

+0

(Aunque mirando a través de la fuente de Unity, no puedo ver muchas implementaciones de Teardown haciendo nada en absoluto ... Pero no hay tiempo para revisarlas todas) – Massif

Respuesta

4

Unity TearDown no hace nada fuera de la caja. No es necesario eliminar de HttpContext.Current.Items, ya que se borrará automáticamente al finalizar la solicitud. Lo que puede hacer es llamar a Dispose en cualquier objeto IDisposable almacenado allí. Se podría hacer esto desde EndRequest en Global.asax:

foreach (var item in HttpContext.Current.Items.Values) 
      { 
       var disposableItem = item as IDisposable; 

       if (disposableItem != null) 
       { 
        disposableItem.Dispose(); 
       } 
      } 
+0

En realidad quiero eliminarlo de HttpContext porque después de este método especial necesito Unity para crear una nueva instancia –

+0

Desea eliminar los elementos del HttpContext y volver a llenarlos llamando al contenedor.¿Resolver todo dentro de la misma solicitud? –

+0

Sí, eso es exactamente lo que quiero. Tengo un método especial que se llama solo ocasionalmente (inicio de la sesión) pero sigue siendo parte de la solicitud http real. Necesito este método para llamar a container.Resolve y obtener una instancia "temporal" que se libera para que el resto de la solicitud obtenga su propia instancia. La razón es que estoy usando ParameterOverrides para pasar algunos argumentos a dependency hiearchy y estos argumentos son diferentes en el método de inicialización. No quiero que el resto de la solicitud funcione con la instancia inicializada con estos argumentos. –

Cuestiones relacionadas