2012-03-06 26 views
5

Tôi đang sử dụng Castle-Windsor làm vật chứa trong ứng dụng Caliburn-Micro Silverlight. Các đối tượng ViewModel của tôi khá hợp lý khi họ gọi các dịch vụ WCF và một loạt các thứ khác. Vì vậy, khi một cửa sổ được đóng lại, tôi muốn gọi container.Release (viewModel) để Castle có thể quản lý toàn bộ quá trình hủy bỏ/xử lý, tôn trọng các vòng đời khác nhau được cấu hình (như được nêu trong this post).Vứt bỏ ViewModels trong Caliburn Micro and Castle Windsor

Trong AppBootstrapper của tôi, tôi đã ghi đè getInstance như sau:

protected override object GetInstance(Type serviceType, string key) 
{ 
    if (string.IsNullOrEmpty(key)) return container.Resolve(serviceType); 
    return container.Resolve(key, serviceType); 
} 

Nhưng tôi đang đấu tranh để tìm ra một cách sạch/thanh lịch gọi container.Release(viewModel). Có vẻ như không có bất kỳ móc có sẵn cho việc này.

Cách đơn giản nhất để phát hành các đối tượng ViewModel được trả về từ ViewModelLocator trong ứng dụng Caliburn Micro là gì?

Trả lời

0

Vòng đời bạn muốn cho từng loại máy ảo của bạn sẽ có tác động ở đây, vì vậy không thực sự là câu trả lời đúng cho ngữ cảnh bạn đã cung cấp.

Lớp cơ sở Screen của CM cung cấp cho bạn protected virtual void OnDeactivate(bool close); là nơi tốt để bắt đầu. Đối với các máy ảo hạng nặng của bạn, bạn nên ghi đè phương thức này và nếu VM đóng được chỉ định bởi tham số đóng, hãy giải phóng bất kỳ tài nguyên nào (các kênh WCF v.v.) cần được xử lý, điều này sẽ bao gồm xử lý tài nguyên (nếu IDisposable có liên quan) và cũng ngắt kết nối bất kỳ tham chiếu đến nó để nó có thể được làm sạch bởi GC.

Tôi không sử dụng Lâu đài nên tôi không thể giúp bạn trong việc định cấu hình vòng đời vv Nhưng nếu bạn làm theo ở trên, bạn sẽ không giữ bất kỳ trọng lượng nặng nào. Tôi giả định rằng với cấu hình vòng đời chính xác, Castle sẽ dọn sạch mọi phiên bản cũ mà bạn sẽ không sử dụng lại chính nó mà không có cuộc gọi rõ ràng tới Release.

+0

Cảm ơn rất nhiều @Simon. Tôi đã khám phá tuyến đường OnDeactivate như một nơi để móc. Có nếu bạn có một máy ảo có danh sách tham số hàm tạo dài, Castle sẽ đáp ứng tất cả các phụ thuộc của hàm tạo của thành phần đó. Sau đó, khi các thành phần là Release() d Castle sẽ phát hành tất cả các phụ thuộc, theo lối sống cấu hình cho mỗi người trong số họ. Điều quan trọng ở đây là bản thân Vms không chịu trách nhiệm cho bất kỳ công việc dọn dẹp nào - tất cả đều tự động. –

+0

Việc đẩy trách nhiệm xuống các máy ảo có thể hoạt động nhưng điều đó có nghĩa là các máy ảo bắt đầu bị ô nhiễm với các trách nhiệm vòng đời mà tôi thực sự muốn tránh xa chúng nếu có thể. Lý tưởng nhất là trách nhiệm giải phóng nên sống với trách nhiệm giải quyết - tức là cao hơn các cuộc gọi stack, trong bootstrapper hoặc tại container chính nó ... –

+0

Vâng thats loại những gì tôi đang nói, như một ví dụ nếu bạn cấu hình loại máy ảo của bạn với một vòng đời của "sử dụng duy nhất" (những gì bao giờ mà bản đồ để trong Castle) sau đó thời gian tiếp theo bạn yêu cầu một thể hiện của loại đó, container nên chỉ phát hành dụ được sử dụng bởi vì nó đã được sử dụng .... không có cuộc gọi rõ ràng để phát hành yêu cầu . –

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