Làm thế nào một người sẽ đi về việc xây dựng phần mềm có thể cắm?


20

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ác mô hình như Người quan sát, Người hòa giải, Chuỗi trách nhiệm quảng cáo xuất hiện trong tâm trí
Mchl

3
@Mchl: Vui lòng gửi câu trả lời của bạn dưới dạng câu trả lời, không phải là nhận xét.
S.Lott

Bạn nên xem Mefthông tin MSDN
Luc Bos

Tôi cảm thấy nó không đủ chi tiết cho điều đó
Mchl

@Mchl: "không đủ chi tiết"? Vậy thì tại sao lại bình luận gì cả? Đó rõ ràng là một câu trả lời. Xin vui lòng gửi câu trả lời như câu trả lời.
S.Lott

Câu trả lời:


13

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


1
+1 Nó không trả lời trực tiếp câu hỏi, nhưng đây là những vấn đề quan trọng cần có trong đầu
Adriano Carneiro

Tôi tin rằng những vấn đề này được đề cập trước khi bất cứ ai bắt đầu phát triển cơ chế mở rộng thực tế
Gus

9

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.AddinsSystem.AddIn .

Đối với Java, có Kiến trúc trình cắm thêm Eclipse .

Mô hình chung là đây:

  • Bạn xác định hợp đồng (thường là giao diện) giữa máy chủ và tiện ích mở rộng
  • Bạn cần một cơ chế khám phá đi ra ngoài và tìm kiếm các tiện ích mở rộng đã cài đặt
  • Bạn cần có khả năng tải động các tiện ích mở rộng và làm cho máy chủ biết về chúng

Trong thực tế, nó chia sẻ rất nhiều với Dependency Injection và Mẫu chiến lược.


+1 MEF và System.AddIn đều là những điều tốt để xem xét. Ngay cả khi bạn không sử dụng chúng, cả hai đều thể hiện các khái niệm tốt.
RationalGeek

@jkohlhepp - Tôi đồng ý và tôi cũng sẽ đề xuất tìm hiểu sâu về kiến ​​trúc SharpDevelop vì có rất nhiều bài viết về nó, đó là nguồn mở (MEF, btw) và nó được thiết kế tốt.
Scott Whitlock

3

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!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.