2009-02-23 26 views
6

Sử dụng lâu đài Windsor, tôi có một thành phần cấu hình với lối sống thoáng:Castle Windsor: Thành phần tạm thời của tôi có bị thu gom rác không?

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

nào sẽ được sử dụng như thế này:

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

Câu hỏi của tôi là, ví dụ dịch vụ sẽ được thu gom rác sau khi nó đi ra khỏi phạm vi, hoặc sẽ Castle Windsor giữ một tham chiếu? Tôi tìm thấy this similar question, ngụ ý rằng trường hợp thứ hai có thể là trường hợp - nhưng sau khi kiểm tra các liên kết được đăng ở đó, tôi không chắc liệu cuộc thảo luận có về việc tham chiếu hay không hoặc đảm bảo rằng đối tượng được xử lý nếu nó triển khai IDisposable. Đối tượng của tôi không cần phải được xử lý.

Nếu Castle Windsor nắm giữ bản sao, có cách nào dễ dàng để ngăn chặn điều này (có thể do cấu hình) không?

EDIT
Dường như, tôi cần đặt chính sách theo dõi phát hành. Điều này có thể được cấu hình trong tập tin cấu hình xml, hay nó cần phải được thiết lập trong mã? Chính sách theo dõi phát hành có thể được đặt trên cơ sở từng thành phần không?

Trả lời

9

Theo mặc định, vùng chứa giữ tham chiếu đến đối tượng của bạn (ngay cả đối tượng tạm thời).

Tuy nhiên, như ghi chú @Bittercoder trong Why does Castle Windsor hold onto transient objects?, bạn có thể change the release tracking policy. Dường như việc lựa chọn

LifecycledComponentsReleasePolicy:

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

Nhưng kể từ khi câu hỏi được hỏi, mà dường như đã trở thành chính sách mặc định.

+0

Cảm ơn. Bạn có biết liệu điều này có thể được cấu hình trên cơ sở cho mỗi thành phần không? (Xem phần chỉnh sửa cho câu hỏi của tôi) – driis

+0

Tôi không nghĩ vậy. Tôi không thực sự sử dụng Castle (tôi muốn), nhưng các tài liệu dường như gợi ý rằng đó là Kernel. Tôi không chắc liệu đây có phải là điều đúng hay không, nhưng có thể thêm chính sách tùy chỉnh chú ý đến loại thành phần của bạn ... –

+0

Cài đặt chính sách phát hành là vùng chứa rộng. Trong thực tế, có các tài liệu chỉ rõ rằng thiết lập của một chính sách phát hành là một trong những điều đầu tiên phải được thực hiện sau khi tạo một cá thể của thùng chứa. Nếu quy tắc này không được theo sau thì một số thành phần sẽ được tạo bằng chính sách phát hành cụ thể và các thành phần khác sử dụng một quy tắc khác. Điều này có thể dẫn đến khả năng gây rò rỉ bộ nhớ cao. – Chai

1

Một điều cần lưu ý là điều này dường như đã được sửa trong Castle Trunk. Trong r5475, Hammett thay đổi chính sách phát hành mặc định trong MicroKernel thành LifecycledComponentsReleasePolicy.

+0

Chưa kiểm tra nguồn, nhưng Reflector dường như gợi ý rằng đây thực sự là trường hợp trong hàm tạo DefaultKernel. Tiện dụng để biết, cảm ơn! – Gavin

+0

Vậy điều này thực sự có ý nghĩa gì? Rằng rò rỉ không phải là một vấn đề với thoáng qua? – Sinaesthetic