Dlaczego Castle Windsor trzyma obiekty przejściowe?

Ostatnio zauważyłem, że moja aplikacja wydaje się jeść pamięć, która nigdy nie zostanie wydana. Po profilowaniu za pomocą Clrprofilera odkryłem, że kontener Castle Windsor, którego używam, trzyma przedmioty. Obiekty te są deklarowane atrybutem lifestyle="transient" w config xml.

Odkryłem, że jeśli umieszczę jawne wywołanie na IWindsorContainer.Release(hangingObject), zniknie ono z referencji.

To powoduje problem, ale nie spodziewałem się, że z przemijającym obiektem stylu życia CastleWindsor zachowałby odniesienie i skutecznie wytworzyłby przeciek. Będzie to dość przyziemne i podatne na błędy zadanie, które będzie umieszczać wyraźne wywołania Wydania we wszystkich odpowiednich miejscach.

Czy widziałeś ten problem i masz jakieś sugestie, jak go obejść?

Author: Liam, 2008-09-25

3 answers

Myślę, że odpowiedzi tutaj brakuje istotnego punktu - że to zachowanie jest konfigurowalne po wyjęciu z pudełka za pomocą zasad wydania-sprawdź dokumentację na stronie projektu castle Tutaj .

W wielu scenariuszach, zwłaszcza tam, gdzie twój kontener istnieje przez cały okres użytkowania aplikacji hostingowej i gdzie tymczasowe komponenty naprawdę nie muszą być śledzone (ponieważ zajmujesz się usuwaniem w kodzie wywołującym lub komponencie, który został wstrzyknięty w Usługę), wtedy można po prostu ustawić politykę wydania na implementację NoTrackingReleasePolicy i z nią skończyć.

Przed Castle v 1.0 wierzę, że zostaną zaimplementowane / wprowadzone obciążenia komponentów - co pomoże złagodzić niektóre z tych problemów, a także pozbyć się wstrzykiwanych zależności itp.

Edit:

Sprawdź następujące posty, aby uzyskać więcej dyskusji na temat obciążenia komponentów.

Obciążenie Składowe-Davy Brions

Również obciążenie komponentu jest zaimplementowane w oficjalne wydanie 2.0 kontenera Windsor.

 20
Author: Bittercoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-11 07:33:15

Należy zauważyć, że wygląda na to, że zostało to naprawione w bagażniku Zamku. W r5475 Hammett zmienił domyślną politykę wydań w Mikrokernelu na LifecycledComponentsReleasePolicy.

 2
Author: Craig Vermeer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-11 07:33:36

Możesz ustawić tryb życia Singletona lub transienta na obiektach w kontenerze. Singleton obiekty, które Rozumiem powinny trwać całe życie aplikacji, ale nie rozumiem przydatności tego behvaviour jest taki sam dla przejściowych!

Niestandardowe style życia mogą być tworzone poprzez implementację ILifestyleManager. Być może jest to możliwe, aby wdrożyć to odpowiednio do stworzenia typu ReallyTransient lifestyle!

 1
Author: Scott Langham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-11 07:34:01