5

Mi caso es Ninject 2.¿Cómo administro la eliminación de objetos cuando uso IoC?

// normal explicit dispose 
using (var dc = new EFContext) 
{ 
} 

Pero a veces es necesario para mantener el contexto más largo o entre llamadas a funciones. Así que quiero controlar este comportamiento a través del alcance de IoC.

// if i use this way. how do i make sure object is disposed. 
var dc = ninject.Get<IContext>() 

// i cannot use this since the scope can change to singleton. right ?? 
using (var dc = ninject.Get<IContext>()) 
{ 
} 

Muestra alcances

Container.Bind<IContext>().To<EFContext>().InSingletonScope(); 
// OR 
Container.Bind<IContext>().To<EFContext>().InRequestScope(); 
+0

duplicado: http://stackoverflow.com/questions/987761/how-do-you-reconcile-idisposable-and-ioc – TrueWill

+0

Gracias por el enlace – Aval

Respuesta

3

Por lo que sé (hice una investigación hace un mes) Ninject no admite la gestión del ciclo de vida en absoluto. Castle Windsor y AutoFac (y hasta cierto punto StructureMap, pero solo cuando usan contenedores anidados) se encargarán de eliminar los componentes desechables que creen en el momento apropiado.

1

Si usted tiene control sobre la interfaz de IContext, añadir IDisposable a la lista de interfaces del que hereda. Si no es así, abatido el IContext se llega a un IDisposable ...

var context = ninject.Get<IContext>(); 

using ((IDisposable)context) 
{ 
} 

Usted también tiene la opción de modificar la interfaz de IContext hacer esto por la composición, si controlas IContext ...

public interface IContext 
{ 
    // ... 

    IDisposable GetUsageHandle(); 
} 

var context = ninject.Get<IContext>(); 

using (context.GetUsageHandle()) 
{ 
} 
+0

gracias. ¿Qué sucede si cambio mi alcance a singleton en el caso anterior? Deshace Bien, la próxima vez que llame a esa función, obtendrá una excepción. – Aval

+0

@Aval: Correcto, por lo que querrá usar la segunda implementación, donde el contexto produce algo que no es un Singleton desechable. Mejor aún, puede comenzar haciendo que la segunda implementación simplemente devuelva el objeto desechable y luego cambie a tener un singleton con sobrepesos desechables sin afectar al cliente. –

+0

gracias, realmente me ha ayudado. – Aval

1

Además de los ámbitos estándar de Transient, OnePerThread y Singleton, puede usar un ActivationBlock para controlar la vida útil de un conjunto completo de objetos. Cuando se elimina el bloque, todos los objetos recuperados por el bloque quedan fuera del ámbito de aplicación, por lo que los elementos individuales y otros se eliminan cuando el bloque de activación solicita sus instancias.

var kernel = new StandardKernel(); 
kernel.Bind<NotifiesWhenDisposed>().ToSelf(); 

NotifiesWhenDisposed instance = null; 
using(var block = new ActivationBlock(kernel)) 
{ 
    instance = block.Get<NotifiesWhenDisposed>(); 
    instance.IsDisposed.ShouldBeFalse(); 
} 

instance.IsDisposed.ShouldBeTrue(); 
Cuestiones relacionadas