Tôi đã gặp phải một số vấn đề trong phần đời của MEF gây rò rỉ bộ nhớ trong ứng dụng Prism của tôi.MEF giữ tham chiếu đến các phần không được chia sẻ IDisposable, không cho phép chúng được thu thập bởi GC
Chế độ xem và chế độ xem xuất của ứng dụng của tôi với PartCreationPolicy
được đặt thành CreationPolicy.NonShared
. Chế độ xem và chế độ xem được kế thừa tương ứng từ ViewBase
và ViewModelBase
, thực hiện IDisposable
.
Bây giờ, vì các bộ phận của tôi thực hiện IDisposable
, một tham chiếu đến chúng được lưu giữ bởi vùng chứa, khiến chúng không bị bộ thu gom rác thải ra. Theo MEF documentation on part lifetime, điều này là do thiết kế:
Các container sẽ không giữ tham chiếu đến phần nó tạo ra trừ khi một trong những điều sau đây là đúng:
- Phần được đánh dấu là
Shared
- Phần thực hiện
IDisposable
- Một hoặc nhiều nhập được định cấu hình để cho phép khôi phục
Làm thế nào sau đó tôi có thể làm cho MEF không giữ một tham chiếu đến các bộ phận này? Có một thuộc tính tôi có thể sử dụng để cho MEF biết tôi không muốn nó giữ một tham chiếu đến phần của tôi ngay cả khi nó thực hiện IDisposable
?
Cả hai chiến lược được thảo luận trong bài viết ở trên không có vẻ như giải pháp tốt cho tôi:
ReleaseExport
đòi hỏi một đối tượngExport
như một tham số, mà tôi không biết làm thế nào để cung cấp. Tôi có thể hiện quan điểm của mình, nhưng không có cách nào để tôi biết hợp đồng được sử dụng để tạo ra cái nhìn. Nó sẽ là tuyệt vời nếu có một quá tải choReleaseExport
mà có thể nhận được bất kỳ đối tượng được tạo ra bởi các container.- Sử dụng thùng chứa trẻ em dường như không phải là một lựa chọn tự nhiên.
Mọi trợ giúp sẽ được đánh giá cao.
Cảm ơn bạn đã trả lời và xin chào mừng. Tôi đoán tích hợp với Prism cùng với 'ExportFactory' là đúng cách để đi, mặc dù nó có vẻ như một overkill cho một yêu cầu đơn giản là" không thêm tôi vào container ". Tôi vẫn chưa từ bỏ - Tôi vẫn đang tìm kiếm một giải pháp đơn giản và thanh lịch hơn cho việc này. –