c# dependency-injection unity-container idisposable unity2.0

c# - Unity RegisterInstance of IDisposable objects



dependency-injection unity-container (2)

Creo que eres bueno Todos los comentarios por subproceso solo importan cuando está utilizando PerThreadLifetimeManager, que no está utilizando. Es solo una redacción torpe en la parte del artículo de MSDN.

Esta no es una terminología estándar, pero en este artículo por contexto se refieren a algo definido por un administrador de tiempo de vida en particular. Para PerThreadLifetimeManager su contexto es su hilo. Para HierarchicalLifetimeManager su contexto es un contenedor particular en su jerarquía de contenedores.

Para ExternallyControlledLifetimeManager no existe un contexto particular, por lo que puede ignorar por completo la nota en cuestión.

Como nota al margen, asegúrese de no disponer de sus instancias mientras espera que el contenedor las resuelva. Si lo hace, su solicitud de resolución devolverá una instancia diferente de la esperada o lanzará una excepción, dependiendo de si el contenedor puede construir su tipo o no.

Unidad 2.0:

Por defecto RegisterInstance usa el ContainerControlledLifetimeManager. Cuando el contenedor de Unity está dispuesto, llama a Dispose en la instancia (si es IDisposable).

En mi caso, eso no es lo que quiero. La instancia pertenece y está dispuesta por otra clase; La unidad debería simplemente inyectar la referencia. Entonces usé:

container.RegisterInstance(instance, new ExternallyControlledLifetimeManager());

La documentación de Unity (en Understanding Lifetime Managers) establece:

El uso del método RegisterInstance para registrar un objeto existente produce el mismo comportamiento que si acabara de registrar el contenedor de por vida con RegisterType. Por lo tanto, se recomienda no utilizar el método RegisterInstance para registrar un objeto existente cuando se utilizan administradores de tiempo de vida no predeterminados, excepto por el hilo en el que se invocó RegisterInstance.

¿Qué significa esto?

La misma sección también dice:

Si registró una instancia existente de un objeto utilizando el método RegisterInstance, el contenedor devuelve la misma instancia para todas las llamadas a Resolve o ResolveAll o cuando el mecanismo de dependencia inyecta instancias en otras clases, siempre que se cumpla uno de los siguientes:

  • Has especificado un administrador de por vida controlado por contenedor
  • Usted ha usado el administrador de por vida predeterminado
  • Se está resolviendo en el mismo contexto en el que registró la instancia cuando usa un administrador de vida diferente.

Intenté resolver en un hilo diferente después de usar RegisterInstance con ExternallyControlledLifetimeManager, y funcionó: obtuve la instancia singleton.

Mi código coincide con un ejemplo en la sección Crear registros de instancia. Sin embargo, quiero asegurarme de que entiendo las advertencias de contexto.

Para que quede claro, siempre quiero que el contenedor de Unity inyecte la instancia que he registrado independientemente del hilo, etc. y no quiero que Unity se deshaga de él. ¿Estoy haciendo esto correctamente?


Tenga en cuenta ExternallyControlledLifetimeManager . Aún debe mantener la referencia a la instancia en algún lugar fuera del contenedor. Una vez que pierde la referencia, puede perder la instancia porque ExternallyControlledLifetimeManager solo tiene WeakReference . Si no tiene una referencia normal, Garbage collector puede recopilar su instancia. Ver ejemplo en mi blog.