c# ioc-container datacontext dispose ninject

c# - Disposición de Ninject y DataContext



ioc-container dispose (3)

Además de los ámbitos estándar de Transient, OnePerThread y Singleton, puede usar un ActivationBlock para controlar la vida útil de todo un conjunto de objetos. Cuando se elimina el bloque, todos los objetos recuperados por el bloque quedan fuera del alcance, por lo que los bloques únicos 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();

Estoy usando Ninject para recuperar mi DataContext del kernel y me preguntaba si Ninject eliminará automáticamente el DataContext, o cómo manejará el comportamiento dispose (). Por experiencias propias, sé que disponer el datacontext es bastante importante y que siempre que cree un objeto directo del DataContext (como en: new DataContext ()) debería usar un bloque using ().

Por lo tanto, mi pregunta es: cuando estoy recuperando mi DataContext del kernel, ¿debo seguir usando un bloque using ()? ¿O Ninject arregla esto para mí?


Estoy investigando esto para mi colega Bas. Estaba buscando en el código fuente de Ninject 2 ( http://github.com/ninject/ninject.git ), y parece que hay algo de gestión del ciclo de vida.

Cuando hay otro alcance que no es transitorio, entonces la recolección de basura de ese alcance activará la desactivación (a través de la canalización) de todas las instancias vinculadas a ese alcance. En la desactivación, una de las estrategias predeterminadas es DisposableStrategy, esta estrategia eliminará la instancia si es IDisposable.

Vi muchas respuestas en stackoveflow que Ninject no hace ninguna gestión del ciclo de vida, ¿tal vez esto fue cierto para una versión anterior de Ninject?

Pero este comportamiento es bastante complicado, ya que al usar servicios inyectados no está al tanto del alcance. Por eso, no sabe si tiene que desechar el objeto usted mismo (transitorio) o si Ninject se encargará de esto.

Los cambios en el alcance de un servicio podrían introducir errores.


No parece que ninject tenga ningún tipo de gestión de por vida. Esta pregunta arroja más luz sobre ella.

Quizás puedas investigar implementando tu propio comportamiento como se muestra en este blog . No lo he probado, pero tal vez pueda hacer algo parecido a un singleton por solicitud con la instancia anterior eliminada cuando se crea la nueva.