Castle Wiki hơi nghiêm ngặt ở đây - cố gắng an toàn hơn là xin lỗi. Nó có thể sử dụng một số rewording có lẽ.
Dù sao - đây là cách hoạt động của nó.
Windsor (theo mặc định) theo dõi hầu hết các thành phần và nó giữ tham chiếu đến chúng, ngăn chặn Garbage Collector thu thập chúng. Đây không phải là một lỗi - đó là một tính năng, và một tính năng vô cùng hữu ích và mạnh mẽ. Trong hầu hết các trường hợp, bạn không nên giả định nếu một thành phần sẽ được theo dõi hay không. Một thành phần không dùng một lần có phụ thuộc dùng một lần cũng sẽ được theo dõi. Đây là quy tắc chung: "thành phần mà bản thân một số phụ thuộc của họ có bất kỳ bước ngừng hoạt động nào được theo dõi theo chính sách phát hành mặc định trong Windsor".
Bây giờ, đây là phần mà thời gian hoạt động của cuộc sống.
Singleton - theo định nghĩa singleton là "toàn cầu" trong bối cảnh container - họ được tạo ra khi bạn lần đầu tiên yêu cầu họ và sống cho phần còn lại của cuộc đời của container (có nghĩa là cho đến khi container bị xử lý). Nếu bạn thấy tài liệu, nó thực sự nói rằng việc phát hành đĩa đơn thực sự không làm bất cứ điều gì. Nó chỉ khi container được xử lý mà mối quan tâm ngừng hoạt động của các thành phần suốt đời của bạn sẽ được gọi.
Mỗi (ngữ cảnh: yêu cầu web/phiên WCF /) - vì đối tượng được chia sẻ trong ngữ cảnh được xác định rõ ràng với kết thúc xác định rõ ràng, kết thúc ngữ cảnh sẽ xử lý các thành phần của bạn.
Tạm thời - Đó là nơi các sự cố thực sự có thể xâm nhập. Vì các thành phần tạm thời không có kết thúc tùy ý và bạn có thể tạo ra các phiên bản trong suốt vòng đời của ứng dụng, không có cách nào khác ngoài việc rõ ràng và nói với các container "hey, tôi sẽ không sử dụng đối tượng này nữa, cảm thấy tự do để thoát khỏi nó, cảm ơn cho tất cả các cá."
Lý do tại sao tài liệu đề xuất luôn phát hành thành phần là mã sử dụng thành phần không thực sự biết tuổi thọ của thành phần là gì. Nó không phải luôn luôn như vậy, và thường trong các ứng dụng có những thành phần "tự nhiên" phù hợp với lối sống. Tuy nhiên, nói chung, như tôi đã nói nó an toàn hơn là xin lỗi.
Một điều khác là nơi bạn gọi số Resolve
và Release
. Bạn chỉ nên bao giờ Release
những gì bạn Resolve
.
Khi bạn sử dụng vùng chứa in similar manner to how I do it, bạn có thể không phải gọi Release
ở bất kỳ nơi nào trong mã của mình. Bạn sẽ Resolve
gốc của mình, nhưng Dispose
của chính vùng chứa sẽ giải phóng nó. Bạn cũng có thể giải quyết các thành phần khác ngầm qua các nhà máy đã nhập, và trong trường hợp này là , bạn cũng nên giải phóng chúng (thông qua nhà máy), nhưng thường là vậy.
Vì vậy, kết quả cuối cùng là, nó không đáng sợ như âm thanh lúc đầu.
Nguồn
2010-07-26 11:41:55
Cảm ơn Krzysztof! Đó là câu trả lời tôi đang tìm kiếm. Về Release và container: Đề nghị của bạn để tránh các "mẫu định vị dịch vụ" (tránh đi qua các container xung quanh) là tất nhiên rất đúng. Tôi chủ yếu đặt câu hỏi bởi vì "câu hỏi phát hành" là giống nhau đối với các nhà máy do cơ sở sản xuất tạo ra. – blueling
Thông báo trước về các quy tắc được giải thích bởi Krzysztof là nếu bạn tự tạo đối tượng và đăng ký cá thể của bạn với container (thay vì cho phép thùng chứa tạo một cá thể cho bạn), thì thùng chứa sẽ để lại việc quản lý vòng đời của cá thể đó lên đến bạn. I E. mặc dù bạn đăng ký nó như là một singleton, các container sẽ không vứt bỏ nó khi bạn vứt bỏ các container. –
chính xác. Cuối cùng nó là cho 'ILifestyleManager' để quyết định, và trong sắp tới Windsor 3 quản lý lối sống có quyền kiểm soát nhiều hơn ở đây. –