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?
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. –
¿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
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. –