2009-02-23 19 views
6

Korzystanie Windsor Castle, mam składnik skonfigurowany z przemijającego życia:Castle Windsor: Czy mój element przejściowy będzie zbiorem śmieci?

<component id="publish.mapping.default" 
        service="IMyService, MyAssembly" 
        type="MyServiceImplementation, Myassembly" 
        lifestyle="transient" /> 

które zostaną wykorzystane w ten sposób:

var service = container.Resolve<IMyService>(componentId); 
// service usage .... 
// service goes out of scope ... 

Moje pytanie brzmi, czy instancja usługa będzie śmieci zebrane po nim wykracza poza zakres, czy też Zamek Windsor będzie trzymał się odniesienia? Znalazłem this similar question, co sugeruje, że to drugie może mieć miejsce - ale po zbadaniu zamieszczonych tam linków nie jestem pewien, czy dyskusja dotyczy zatrzymania odniesienia, czy też zapewnienia, że ​​obiekt zostanie usunięty, jeśli implementuje IDisposable. Moje obiekty nie muszą być usuwane.

Jeśli Zamek Windsor trzyma się instancji, czy istnieje prosty sposób, aby temu zapobiec (być może przez konfigurację)?

EDIT
Wygląda na to, że muszę ustawić zasady śledzenia wersji. Czy można to skonfigurować w pliku konfiguracyjnym xml, czy też trzeba go ustawić w kodzie? Czy zasady śledzenia wersji mogą być ustawione dla poszczególnych komponentów?

Odpowiedz

9

Domyślnie kontener zawiera odniesienie do twoich obiektów (nawet tych przejściowych).

Jednak, jak @Bittercoder zauważa w Why does Castle Windsor hold onto transient objects?, można change the release tracking policy. Wydaje się, że wybór

LifecycledComponentsReleasePolicy:

var policy = container.Kernel.ReleasePolicy; 
container.Kernel.ReleasePolicy = LifecycledComponentsReleasePolicy; 

Ale skoro padło pytanie, które pojawia się stały polityka domyślna.

+0

Dzięki. Czy wiesz, czy można to skonfigurować dla każdego komponentu? (Zobacz edycję na moje pytanie) – driis

+0

Nie sądzę. Właściwie nie używam Castle (chciałbym), ale dokumenty sugerują, że jest to Kernel. Nie jestem pewien, czy to jest właściwe, ale może być możliwe dodanie niestandardowej polityki zwracającej uwagę na typ komponentu ... –

+0

Ustawienie zasady zwolnienia ma szeroki zakres. W rzeczywistości istnieją dokumenty, które określają, że ustawienie polityki zwolnienia jest jedną z pierwszych rzeczy, które należy zrobić po utworzeniu instancji kontenera. Jeśli ta reguła nie zostanie zastosowana, niektóre komponenty zostaną utworzone przy użyciu określonych zasad wydawania, a inne za pomocą innych. Może to spowodować wysokie prawdopodobieństwo spowodowania wycieków pamięci. – Chai

1

Jedną z rzeczy, którą należy zauważyć, jest to, że zostało to naprawione w pniu zamku. W r5475 Hammett zmienił domyślną politykę wydawania w MicroKernel na LifecycledComponentsReleasePolicy.

+0

Nie sprawdziłem źródła, ale Reflector wydaje się sugerować, że tak właśnie jest w konstruktorze DefaultKernel. Handy wiedzieć, dzięki! – Gavin

+0

Co to naprawdę oznacza? Że przeciek nie powinien być problemem z przejściowym? – Sinaesthetic

Powiązane problemy