Wiem, że zostało to omówione na ad nauseum ... ale mam problem ze sposobem, w jaki Windsor śledzi Transient IDisposable objects.Castle Windsor Transient Disposables
Rozumiem korzyści płynące z pozwolenia Windsor na zarządzanie swoimi IDiposabiliami ... ale nie podoba mi się to.
Co się stanie, jeśli chcę zawinąć mój komponent w blok przy użyciu? Koder mógłby założyć, że zasób zostanie oczyszczony na końcu bloku, prawda? Wrong - Dispose zostanie wywołany, ale Windsor będzie trzymał się instancji, dopóki nie zostanie wyraźnie zwolniony. To wszystko jest dla mnie dobre i dobre, ponieważ wiem, co robię ... ale co z innym programistą, który koduje klasę i chce używać IDisposable tak, jak zwykle używa się każdego innego IDisposable - w bloku używanym?
using(factory.CreateInstance())
{
....
}
wygląda o wiele jaśniej mi niż:
MyDisposable instance;
try
{
instance = factory.GetInstance();
}
finally
{
factory.Release(instance);
}
Aby prawdziwie rozporządzania moich wystąpień i mieć je kwalifikować się do GC, muszę odwołać WindsorContainer lub użyj fabrykę wpisywanych że naraża uwolnienie metoda. Oznacza to, że jedynym akceptowalnym sposobem użycia komponentów IDisposable jest użycie fabryki maszynowej. To nie jest dobre, moim zdaniem ... co jeśli ktoś doda interfejs IDisposable do istniejącego komponentu? Każde miejsce, w którym oczekuje się wstrzyknięcia komponentu, będzie musiało ulec zmianie. To naprawdę złe w mojej opinii. (Przyznane, w scenariuszu bez DI, musiałoby się zmienić na wywołanie Dispose także ... ale z Windsor każde miejsce będzie musiało się zmienić, aby użyć maszynki do pisania, która jest znacznie większą zmianą).
OK, wystarczy, mogę użyć niestandardowej wersji ReleasePolicy? Co powiesz na to?
public class CustomComponentsReleasePolicy : AllComponentsReleasePolicy
{
public override void Track(object instance, Burden burden)
{
if (burden.Model.LifestyleType == LifestyleType.Pooled)
base.Track(instance, burden);
}
}
Ok, świetnie, mój IDisposable Elementy przejściowe będą teraz GC.
Co zrobić, jeśli chcę korzystać z TypedFactory, aby moja klasa mogła wygenerować wiele wystąpień typu?
public interface IMyFactory
{
MyDisposable GetInstance();
void Release(MyDisposable instance);
}
[Singleton]
public class TestClass
{
public TestClass(IMyFactory factory) { }
}
Ok, dobrze, dla jednego, nazywając Release on fabrycznie nie zrobi nic, aby zadzwonić Dispose() na MyDisposable, ponieważ MyDisposable nie jest śledzone ....
Jak mogę przezwyciężyć te trudności?
Dzięki.
myślę, że będę musiał blog o tym –
Dzięki. Przeczytam to :) – Jeff