Tôi đang xây dựng một ứng dụng dựa trên .NET và muốn cho phép một thiết kế mở rộng và có thể cắm thêm được.Cho phép các trình cắm thêm C# đăng ký trên các móc ứng dụng
Vì lợi ích của sự đơn giản, ứng dụng cho thấy một tập hợp các hoạt động và các sự kiện:
- DoSomething()
- DoOtherThing()
- onerror
- onSuccess
tôi muốn cung cấp "plugins" để được tải và móc vào một số các hoạt động này (giống như: Khi Event1 kích hoạt, hãy chạy plugin1).
Ví dụ - chạy plugin1.HandleError() khi sự kiện OnError kích hoạt.
Điều này có thể được thực hiện dễ dàng với thuê bao sự kiện:
this.OnError += new Plugin1().HandleError();
Vấn đề là:
- Ứng dụng của tôi không biết loại "Plugin1" (nó là một plugin, tôi ứng dụng không tham chiếu trực tiếp).
- Làm như vậy sẽ khởi tạo plugin trước thời gian, điều tôi không làm muốn thực hiện.
Trong các mô hình plugin "truyền thống", ứng dụng ("máy khách" của plugin) tải và thực thi mã plugin tại một số điểm chính. Ví dụ: ứng dụng xử lý hình ảnh, khi thực hiện một số thao tác nhất định).
Kiểm soát thời điểm khởi tạo mã plugin và thời điểm thực thi nó được biết đến với ứng dụng khách.
Trong ứng dụng của tôi, chính plugin đó là để quyết định khi nào cần thực thi ("Plugin nên đăng ký trên sự kiện OnError").
Việc giữ mã "thực thi" cùng với mã "đăng ký" đặt ra một vấn đề mà plugin DLL với sẽ được tải vào bộ nhớ vào thời điểm đăng ký, điều mà tôi muốn ngăn chặn.
Ví dụ: nếu tôi thêm phương thức Register() vào plugin DLL, plugin DLL sẽ phải được tải vào bộ nhớ để phương thức đăng ký được gọi.
Giải pháp thiết kế tốt cho vấn đề cụ thể này là gì?
- Tải nhẹ nhàng (hoặc cung cấp tải chậm/háo hức) của plugin DLL.
- Cho phép plugin kiểm soát các phần khác nhau của hệ thống/ứng dụng mà chúng móc vào.
nhược điểm của chiến lược này là rất chậm khi tải lắp ráp. Đây là vấn đề phổ biến cho sự phản ánh trong .Net –
Cảm ơn tôi đã biết làm thế nào để làm điều này. Những gì tôi muốn thiết kế là một cách để cho phép các plugin để đăng ký vào các sự kiện nhất định, mà không cần tải nó trước. –
Tôi không nghĩ rằng nó có thể cho dll plugin để làm * bất cứ điều gì * cho đến khi nó thực sự được nạp. Một giải pháp là đặt một lớp định nghĩa của plugin trong mỗi assembly lắp đặt plugin/nói với máy chủ về khả năng của nó. Khi ứng dụng của bạn bắt đầu, bạn có thể tìm thấy tất cả các lớp định nghĩa và thực hiện hành động thích hợp (có lẽ chỉ cần gọi phương thức "Cấu hình" trên mỗi). –