2008-09-25 19 views
29

Ostatnio zauważyłem, że moja aplikacja wydaje się jeść pamięć, która nigdy nie zostanie wydana. Po profilowaniu za pomocą CLRProfiler odkryłem, że kontener Castle Windsor, którego używam, trzyma się obiektów. Obiekty te są zadeklarowane za pomocą atrybutu lifestyle = "transient" w pliku konfiguracyjnym xml.Dlaczego Castle Windsor trzyma się obiektów przejściowych?

Znalazłem, jeśli jednoznaczne połączenie z IWindsorContainer.Release(hangingObject), że spadnie jego odniesienia.

Powoduje to jednak problem, nie spodziewałem się, że w przypadku przejściowego obiektu stylu życia CastleWindsor zachowa odniesienie i skutecznie stworzy wyciek. Będzie to raczej prozaiczne i podatne na błędy zadanie, które będzie polegało na wstawianiu wyraźnych wywołań Release we wszystkich odpowiednich miejscach.

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

Odpowiedz

20

Myślę, że w odpowiedziach brakuje tutaj kluczowego punktu - że to zachowanie można skonfigurować po wyjęciu z pudełka za pośrednictwem polityki wydawania - sprawdź dokumentację na stronie projektu zamkowego here.

W wielu sytuacjach, w których pojemnik jest przechowywany przez cały okres użytkowania aplikacji hostującej, i gdzie przejściowe komponenty nie muszą być śledzone (ponieważ zajmujesz się utylizacją kodu wywołującego lub składnika, który został wstrzyknięty usługi), możesz po prostu ustawić politykę wydania do implementacji NoTrackingReleasePolicy i zrobić z nią.

Przed zamku v 1.0 wierzę Składnik Ciężar będą realizowane/wprowadzony - które pomogą złagodzić niektóre z tych zagadnień, a także wokół zbycia wstrzyknięto zależności itp

Edit:

wyjazdu następujące posty dla większej ilości dyskusji na temat obciążenia komponentów.

The Component Burden - Davy Brions

także obciążenie składnikiem jest realizowany w official 2.0 release pojemnika Windsor.

1

Można ustawić tryb życia singleton lub przejściowy na obiektach w kontenerze. Obiekty Singleton, które rozumiem, powinny trwać przez całe życie aplikacji, ale nie rozumiem przydatności tego zachowania dla tych nieustalonych!

Własne style życia można tworzyć, wdrażając ILifestyleManager. Być może możliwe jest zaimplementowanie tego w odpowiedni sposób, aby stworzyć styl życia w stylu ReallyTransient!

2

Jedna rzecz do zapamiętania to, że to wydaje się być naprawione w Pniu Zamku. W r5475 Hammett zmienił domyślną politykę wydawania w MicroKernel na LifecycledComponentsReleasePolicy.

Powiązane problemy