Por esta misma razón he hecho mi propio contenedor de IoC que devuelve (en C# /. NET) envoltorios de servicio desechables, que cuando se desechan, "harán lo correcto" con respecto al servicio.
se trate de:
- No hacer nada, cuando:
- El objeto no implementa IDisposable
- No es contenedor de ámbito (en cuyo caso el contenedor se mantendrá un registro de la misma y de retorno el mismo objeto más de una vez, y cuando el contenedor se desecha, el objeto también lo estará)
- No se ha agrupado
- No es singleton -scoped (igual que el recipiente de ámbito, pero una jerarquía de contenedores almacenará el servicio singleton de ámbito en el recipiente superior)
- botar el servicio (tiene alcance de la fábrica, e implementa IDisposable)
- Return a la piscina
Esto significa que todo el código que utiliza mis servicios está dentro de un bloque usando, pero la intención es más claro, al menos para mí:
using (var service = container.Resolve<ISomeService>())
{
service.Instance.SomeMethod();
}
básicamente que sA ys: resuelva un servicio, llame a SomeMethod en la instancia del servicio y luego deséchelo.
Dado que el conocimiento de si disponer de la instancia de servicio o no no está disponible para el consumidor, se optó simplemente por ignorar las implementaciones IDisposable o deshacerse de todos los servicios que implementan IDisposable. Tampoco fue una buena solución para mí.La tercera opción fue envolver la instancia del servicio en un objeto que sabía qué hacer con el servicio una vez que se eliminó el envoltorio.
Vea también http://stackoverflow.com/questions/987761/how-do-you-reconcile-disposable-and-ioc y http://unity.codeplex.com/Thread/View.aspx?ThreadId=38588 – TrueWill