Nếu bạn có một ứng dụng nào đó và bạn muốn người dùng của mình có thể viết plugin cho nó, ứng dụng nên được thiết kế như thế nào?
Bạn phải tính đến điều gì, những mẫu thiết kế nào dành cho việc này v.v?
Nếu bạn có một ứng dụng nào đó và bạn muốn người dùng của mình có thể viết plugin cho nó, ứng dụng nên được thiết kế như thế nào?
Bạn phải tính đến điều gì, những mẫu thiết kế nào dành cho việc này v.v?
Câu trả lời:
Nó phụ thuộc vào nền tảng của bạn nhưng một số điều chung cần ghi nhớ
Phiên bản Điều gì xảy ra nếu bạn cập nhật ứng dụng của mình, liệu tất cả các plugin cũ có bị lỗi thời không (vấn đề firefox)
Cô lập Các plugin có thể làm bất cứ điều gì họ muốn? Bạn luôn tin tưởng họ? Hoặc bạn cần chạy chúng trong một số loại hộp cát và yêu cầu quyền.
Cập nhật Làm thế nào để bạn xử lý các cập nhật plugin?
Bảo mật Làm thế nào để bạn đảm bảo tác giả của một plugin, ngăn chặn giả mạo hoặc người dùng bị lừa cài đặt mã độc. Thường được giải quyết bằng một số loại ký mã
Tuần tự hóa Thông thường khi bạn sử dụng cách ly một số loại, bạn cần tuần tự hóa thông tin giữa các luồng hoặc quy trình khác nhau. Làm thế nào để bạn làm điều đó một cách hiệu quả nhất?
Khả năng mở rộng Những khía cạnh nào bạn cần mở rộng? Làm thế nào để bạn tối đa hóa tiềm năng của các plugin mà không cần API trở nên khó sử dụng.
Nếu bạn đang nhắm mục tiêu các nhà phát triển bên thứ ba cho các plugin, tôi nói điều quan trọng nhất (từ kinh nghiệm của tôi) là xem api và các lớp của plugin hoàn toàn khác biệt với phần còn lại của ứng dụng và giúp nó dễ dàng phát triển hơn càng tốt Kiến trúc từ ứng dụng chính rất dễ dàng "chảy máu" vào các plugin để các tác giả plugin phải học nhiều hơn những gì họ phải làm. Làm cho họ dễ dàng, suy nghĩ về loại giao diện và trải nghiệm bạn muốn làm tác giả plugin.
Một suy nghĩ tốt khác là không nghĩ như "Plugin sẽ làm tất cả những điều này (bằng mã) mà là" plugin cần cung cấp thông tin này ". Bằng cách đó, ứng dụng có thể tiêu thụ thông tin cần thiết và xử lý thực tế sẽ đơn giản hóa các plugin.
Ngoài ra, nói chung, bất cứ khi nào bạn có thể đi theo cách tiếp cận mô tả (siêu dữ liệu, như xml) thay vì mã bạn có lợi thế lớn vì siêu dữ liệu dễ vận chuyển, phiên bản, triển khai, bảo mật và có thể dễ dàng được cấu hình bởi bên thứ ba
Tôi đã viết bài viết về Dự án Mã này về việc sử dụng MEF cho khả năng mở rộng trong .NET. Đó là một giới thiệu tốt.
Có các khung mở rộng khác cho .NET, chẳng hạn như Kiến trúc bổ trợ của SharpDevelop , Mono.Addins và System.AddIn .
Đối với Java, có Kiến trúc trình cắm thêm Eclipse .
Mô hình chung là đây:
Trong thực tế, nó chia sẻ rất nhiều với Dependency Injection và Mẫu chiến lược.
Bạn chỉ cần cung cấp một giao diện cho các plugin.
Nó nên chứa ít nhất một Activate-Methode (một điểm vào), nhưng bạn cũng sẽ muốn những thứ như Khởi tạo, v.v.
Và nên có khả năng giao tiếp với ứng dụng máy chủ theo cách giống như đăng ký, ví dụ để đăng ký các mục menu. Vì vậy, đăng ký cho những thứ có thể thay đổi / mở rộng cho các plugin nên được cung cấp.
Ngoài ra, cần có một số lưu trữ có thể truy cập cho dữ liệu và đối tượng của ứng dụng chủ, vì vậy các plugin có thể gọi các thường trình của nó. Điều này có thể dễ dàng được thực hiện bằng cách sử dụng DI-Container như Unity và để các plugin truy cập nó, để họ có thể giải quyết các dịch vụ họ cần.
Bộ tổng hợp sự kiện có lẽ cũng là một ý tưởng hay, vì vậy các plugin có thể ném các sự kiện và phản ứng với các sự kiện từ các plugin khác và ứng dụng máy chủ theo cách tách rời. Bạn chắc chắn muốn một!