Sé que esto se ha discutido hasta el cansancio ... pero tengo un problema con la forma en que Windsor rastrea los objetos transitorios identificables.Castle Windsor Transient Disposables
Entiendo los beneficios de dejar que Windsor administre mis IDiposables ... pero no me gusta.
¿Qué sucede si quiero envolver mi componente en un bloque de uso? El codificador supondría que el recurso se limpiaría al final del bloque de uso, ¿verdad? Wrong - Dispose se invocará, pero Windsor retendrá la instancia hasta que se lance explícitamente. Todo esto está bien y bien para mí, ya que sé lo que estoy haciendo ... pero ¿qué pasa con otro desarrollador que está codificando una clase y quiere usar un IDisposable de la misma manera que cualquier otro IDisposable usualmente utilizado, en un bloque de uso?
using(factory.CreateInstance())
{
....
}
se ve mucho más claro para mí que:
MyDisposable instance;
try
{
instance = factory.GetInstance();
}
finally
{
factory.Release(instance);
}
Con el fin de disponer verdaderamente mis casos y tenerlos elegibles para GC, necesito hacer referencia a la WindsorContainer o utilizar una fábrica de mecanografiado que expone un comunicado método. Eso significa que la única forma aceptable de usar componentes IDisposable es usar una fábrica de tipografía. Esto no es bueno, en mi opinión ... ¿y si alguien agrega la interfaz IDisposable a un componente existente? Todos los lugares que esperan que se inyecte el componente deberán cambiarse. Eso es realmente malo en mi opinión. (Por supuesto, en un escenario sin DI, tendría que cambiar para llamar a Dispose también ... pero con Windsor, cada lugar tendrá que cambiar para usar una fábrica de tipeo, que es un cambio mucho mayor).
Ok, es justo, puedo usar un ReleasePolicy personalizado ¿verdad? ¿Qué tal esto?
public class CustomComponentsReleasePolicy : AllComponentsReleasePolicy
{
public override void Track(object instance, Burden burden)
{
if (burden.Model.LifestyleType == LifestyleType.Pooled)
base.Track(instance, burden);
}
}
Ok, genial, mi IDisposable Transient components será GC'd ahora.
¿Qué sucede si quiero usar TypedFactory para que mi clase pueda producir muchas instancias de un tipo?
public interface IMyFactory
{
MyDisposable GetInstance();
void Release(MyDisposable instance);
}
[Singleton]
public class TestClass
{
public TestClass(IMyFactory factory) { }
}
Ok, así, por ejemplo, llamando lanzamiento en la fábrica no hará nada para llamar a Dispose() en MyDisposable, ya que no se realiza un seguimiento MyDisposable ....
¿Cómo puedo superar estas dificultades?
Gracias.
Creo que voy a necesitar un blog acerca de este –
Gracias. Lo leeré :) – Jeff