2010-06-03 27 views
21

Trong phiên bản mới nhất của MVVM ánh sáng (V3 SP1) cả "Vứt bỏ()" và "Vứt bỏ (bool)" phương pháp trong lớp ViewModel được đánh dấuCleanup vs Dispose (bool) trong MVVM nhẹ

Không sử dụng phương thức này nữa, nó sẽ bị xóa trong phiên bản sau. Sử dụng ICleanup.Cleanup() thay vì

Điều này có nghĩa rằng giao diện IDisposable phải không được thực hiện ở tất cả các lớp ViewModel rằng có nguồn gốc từ GalaSoft.MvvmLight.ViewModelBase (và dọn dẹp phải được overrided)?

Nếu có, không thể sử dụng cho trường hợp kiểu xem ... Có lẽ tôi không hiểu điều gì đó ... Vui lòng làm rõ ... Lợi ích của việc dọn dẹp đó là gì?

Cảm ơn.

Trả lời

27

Vấn đề là lịch sử. Lúc đầu, tôi nghĩ rằng nó sẽ là một ý tưởng tốt để buộc tất cả các máy ảo được IDisposable. Tuy nhiên, IDisposable có một ý định khác nhau: Một khi VM được xử lý, nó được dự kiến ​​(theo quy ước) rằng nó sẽ được thu gom rác càng sớm càng tốt. Sau khi nói chuyện với bạn bè, tôi nhận ra rằng buộc tất cả các máy ảo phải là IDisposable là một sai lầm. Đây là lý do tại sao tôi thay thế IDisposable bởi ICleanup. Mục đích của ICleanup là cung cấp một cách để làm sạch các máy ảo (ví dụ xả trạng thái của chúng sang lưu trữ liên tục, đóng các luồng vv ...) nhưng không nhất thiết theo cách chúng sẽ được thu gom rác càng sớm càng tốt.

Không có gì ngăn bạn làm cho máy ảo của bạn triển khai IDisposable. Tôi không muốn giữ ràng buộc này trong lớp ViewModelBase, đó là lý do tại sao giao diện này sẽ bị loại bỏ trong V4.

Lợi ích của việc có ICleanup là bạn có thể xóa tất cả các máy ảo của mình trong một cuộc gọi của ViewModelLocator.Cleanup(). Đó là một gợi ý cho các nhà phát triển VM nói rằng các máy ảo nên nghĩ đến việc cung cấp một phương thức dọn dẹp cho các máy ảo của họ.

Điều đó có hợp lý không? Chúc mừng, Laurent

+0

Cảm ơn bạn đã bình luận, nó chắc chắn làm cho sence nếu bạn cần phải có khả thi VM sau clening của nó ... Nhưng tôi không thấy có lý do để làm sạch nó lên mà không cần xử lý. .. Thông thường tôi đang giải tán VM khi đóng cửa ... tại sao tôi cần phải làm sạch nó mà không đóng cửa? Tôi sẽ được đánh giá cao với bất kỳ phản hồi nào. cảm ơn một lần nữa. – Budda

+4

@Budda những gì tôi tin rằng LBugnion đang nói là khái niệm mà ông đã sử dụng cho IDisposable đã quá tải với ý tưởng GC đối tượng càng sớm càng tốt. Tuy nhiên, rất nhiều người trong chúng ta sử dụng cùng một đối tượng VM nhiều lần, vì vậy thay vì vứt bỏ đối tượng ViewModelBase đã được đưa ra một Giao diện ICleanUp có ý định xóa sạch VM Clean để nó có thể được sử dụng lại. Điều này có thể hữu ích nếu bạn đang làm một phương pháp tiếp cận VM đầu tiên, WPF sẽ không vứt bỏ View và sau đó tạo lại nó, thay vào đó nó sẽ được làm sạch giống như máy ảo. – Agies

+0

Cảm ơn. Bây giờ rõ ràng là – Budda

2

Tôi nghĩ rằng tôi cầu xin một chút khác biệt với Laurent vào thời điểm này. Ý tưởng đằng sau IDisposable là đối tượng có thể có một số dọn dẹp mà cần phải diễn ra và không, mỗi se, có bất cứ điều gì để làm với thu gom rác thải. Trong thực tế, hầu hết IDisposable thời gian được triển khai để làm sạch các tài nguyên không được quản lý, chẳng hạn như xử lý tệp, đối tượng đồng bộ hóa hoặc kết nối cơ sở dữ liệu nằm ngoài tầm nhìn của GC. Bên cạnh đó, chỉ vì một lớp cơ sở thực hiện IDisposable không có nghĩa là nó phải có một thực hiện thực tế. Điều đó có thể được chuyển xuống phương thức Dispose (bool disposing) ảo có thể được overriden bởi các lớp dẫn xuất để chúng có thể thực hiện dọn dẹp.

Vấn đề, như Budda ám chỉ, đó là IDisposable là do quy ước một hoạt động một chiều. Khi một đối tượng đã được xử lý, nó sẽ ném một ObjectDisposedException vào các phương thức công khai của nó. Nếu tất cả những gì bạn muốn làm là loại bỏ các tài nguyên để bạn có thể tái sử dụng đối tượng, thì một phương thức Dọn dẹp có ý nghĩa. Tuy nhiên, tôi sẽ không nhất thiết phải loại bỏ chức năng Dispose, phục vụ một mục đích khác.

+1

Tài nguyên không được quản lý được yêu cầu được phát hành trong phương thức Hoàn tất. Bạn cũng có thể buộc hệ thống giải phóng chúng trong khi xử lý và triệt tiêu hoàn thiện trong trường hợp này (xem cách triển khai thực hiện phương thức "Vứt bỏ") – Budda

2

Câu chuyện nhỏ "thú vị": khi các lập trình viên tìm thấy trong nhóm của tôi đã không hủy đăng ký sự kiện, tôi 'rửa' IDisposable xuống phân cấp mô hình chế độ xem của chúng tôi để thay đổi suy nghĩ của mình về việc Vứt bỏ đúng vị trí hay không.

Trong một số trường hợp, rất khó gọi là Vứt bỏ vì MEF và một số cách thú vị khác mà chúng tôi tạo ra các mô hình xem của chúng tôi. Điều này khiến tôi tự hỏi liệu nó có đúng không.Và sau đó là một thực tế rằng Vứt bỏ một số nhu cầu chăm sóc (và một đoạn) để có được quyền:

DG Update: Dispose, Finalization, and Resource Management

Sau đó, tôi đã làm một số công việc cuối tuần trên một ứng dụng WP7 (nơi tôi sử dụng MVVM Light) và nhận thấy sự thay đổi Laurent của trái tim, quá.

Tôi nghĩ đó là quyết định đúng đắn; IDisposable gửi một thông điệp rằng "khách hàng" nên thử và bọc việc sử dụng lớp trong một using() hoặc bằng cách khác rửa tay của họ trong ví dụ ASAP.

Ban đầu, tôi đồng ý với câu trả lời được chấp nhận trong chuỗi bên dưới nhưng sau đó tôi bắt đầu nghĩ rằng JaredPar đã đúng.

Using IDisposable to unsubscribe events

Luke

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