2010-07-26 28 views
10

Castle wiki nói ở một số nơi tôi nên LUÔN gọi container.Release() cho các thành phần được giải quyết thông qua vùng chứa. Điều này rõ ràng có ý nghĩa đối với các kỹ thuật quản lý kiểu sống tinh vi (ví dụ: LifeStyle.Pooled) hoặc khi sử dụng các cơ sở chuyên ngành ...Castle Windsor - Tôi có phải giải phóng các vật thể tạm thời đơn hoặc không dùng một lần không?

Nhưng tôi có thực sự phải phát hành singleton (sống cho đến khi container được xử lý) và không đối tượng thoáng qua dùng một lần? Nếu tôi duyệt qua các cuộc gọi Release() cho các đối tượng tạm thời hoặc các trình đơn, các cuộc gọi này dường như không cần thiết - .e.g. trong trường hợp các đối tượng tạm thời không triển khai IDisposable, hạt nhân đơn giản thông báo rằng nó không có dấu vết của đối tượng và trả về ...

Có vẻ như khái niệm "gánh nặng thành phần" để theo dõi các tham chiếu "gián tiếp" thành phần dùng một lần có thể được xây dựng trong khi giải quyết một đối tượng thoáng qua. Tôi hiểu rằng nó là cần thiết để phát hành các đối tượng thoáng qua nếu bạn không biết 100% cho dù họ có phụ thuộc gián tiếp như vậy hay không. Đây có phải là lý do chính để "thúc giục" tất cả người dùng Lâu đài đến ALWAYS thành phần phát hành không?

Trả lời

19

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ố ResolveRelease. 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.

+0

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

+2

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. –

+0

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. –

Các vấn đề liên quan