2011-04-20 14 views
6

hemos configurado un servicio WCF que usa Unity Container para resolver instancias de administración de comandos de Exchange 2010 Powershell. Definimos una interfaz IExchangePowershell que tiene una implementación concreta que implementa IDisposable. Después de un tiempo nos encontramos con el problema de que no podíamos ejecutar comandos de PowerShell más ya que el servidor dijo que ya hay demasiadas sesiones de PowerShell abiertas. Parece que nunca nos deshicimos de nuestras instancias de Powershell. El método Dispose() de Powershell concreto se encargaría de cerrar el espacio de ejecución y la sesión. Una vez que llamo esto en los métodos de repositorio, ya no obtenemos los errores.WCF, Unity: instancias desechables de desmontaje

((IDisposable)this.powershell).Dispose(); 

Ahora, por supuesto, no quiero llamar explícitamente a deshacerse de cada método de repositorio. Pensé que la unidad podría encargarse de esto. Nuestro proveedor de WCF Instancia hace esto:

public void ReleaseInstance(InstanceContext instanceContext, object instance) 
{ 
    container.Teardown(instance); 
} 

Pero eso no realmente disponer de los casos IExchangePowershell. ¿Tiene alguna idea de cómo podría deshacerme automáticamente de esas instancias?

Respuesta

10

Eso es realmente un problema bien conocido en Unity. TearDown método does nothing. Si desea usar TearDown, debe crear una extensión de contenedor personalizada.

Escribí article sobre el uso de administradores de vidas útiles en Unity y su impacto en la eliminación. Si usa los valores predeterminados TransientLifetimeManager o PerResolveLifetimeManager, la Unidad incluso no rastreará la existencia de sus objetos para que no pueda llamar al Dispose. Los únicos administradores de por vida que llaman a Dispose en instancias resueltas son ContainerControlledLifetimeManager (también conocido como singleton) y HierarchicalLifetimeManager. Se llama al Dispose cuando se elimina el administrador de por vida.

La solución para usted es usar fundición y manejar Dispose manualmente como lo hizo o cambiar a HiearchicalLifetimeManager y crear subcontenedor nuevo para cada solicitud WCF entrante. Cada subcontenedor solo manejará solicitudes individuales y eliminará las entidades resueltas con una vida jerárquica.

Existen otras formas, por ejemplo, this article crea un código muy complejo alrededor de Unity para admitir la eliminación y TearDown para todos los objetos resueltos.

+1

1. Creo que usar sub-contenedores es una buena solución.He visto personas que discutieron ferozmente contra eso, porque no les gusta depender de un contenedor DI, pero yo personalmente lo haría si esto es lo que se necesita para resolver un problema. –

+0

¿Tiene algún consejo sobre dónde colocar el HiearchicalLifetimeManager en WCF? A partir de ahora estoy creando mi Unity Container en mi Service Host Factory y configurándolo desde allí. – hoetz

+0

Bueno, eso depende de la forma en que resuelves los objetos y qué tipo de objetos resuelves. Por ejemplo, implementé el 'IInstanceProvider' personalizado para resolver todo el servicio y todas sus dependencias a través de la inyección de constructores. En tal caso, el proveedor de la instancia es el lugar donde debe manejar la creación de un subcontenedor y la resolución del servicio en el subcontenedor. –

0

La respuesta depende de cómo registre su tipo/instancia con la unidad. La implementación estándar de Teardown no hace nada en absoluto.

Si registra el tipo, Unity no almacena la referencia a la instancia que crea; le corresponde a usted administrar su tiempo de vida y desecharlo. Si registra una instancia, la vida de la instancia se gestiona por unidad y se conserva hasta que se deshaga del contenedor.

El siguiente enlace ayuda a entender un poco mejor acerca de la gestión de toda la vida: http://msdn.microsoft.com/en-us/library/ff648098.aspx

que hay que preguntarse a sí mismo cuando le gustaría que sus objetos destinados a la venta. Si sabe cuándo llamar a ReleaseInstance, también puede llamar a ID en lugar de hacerlo.

(lo siento, no estoy familiarizado con WCF, así que no estoy seguro de qué instancia proporcionan Es en este contexto)

Cuestiones relacionadas