2011-08-16 31 views
5

Vấn đề:
Tôi đang xây dựng một khuôn khổ mà chấp nhận một tập tin, dịch nó và thực hiện nó. Khung này có thể xử lý bất kỳ loại tệp nào, cho đến cuối này, tôi đã cung cấp phương thức tải lên một DLL chứa các lớp và phương thức cho việc biên dịch dịchthi hành một tệp. Những gì tôi đang tìm kiếm, là cách tốt nhất để xác định giao diện Pluginmẫu Plugin trong C#

Giải pháp A:
Xác định một tập hợp các giao diện đó là công bố rộng rãi. Plugin nên triển khai các giao diện này.

Giải pháp B:
Xác định một số lớp trừu tượng có sẵn công khai. Các trình cắm thêm cần phải thu thập và ghi đè các phương thức trừu tượng trên các lớp này.

Giải pháp C:rcravens
giao diện đèo quanh bên trong mã, tạo ra một lớp trừu tượng mà là công khai có sẵn để cho phép cắm mở rộng. Được chọn
Giải pháp này đã được chọn trước giao diện chỉ vì nó cho phép triển khai cơ bản (tiện dụng trong trường hợp này). Nó được chọn trước lớp trừu tượng chỉ vì nó cho phép nhạo báng trong mã. Các khung thành phần là tuyệt vời, nhưng một chút trên đầu cho một cái gì đó nhẹ như ứng dụng này, nơi chỉ có khả năng mở rộng hạn chế là mong muốn.

Giải pháp D:JayChris Shain
Thực hiện một khuôn khổ tổng hợp (chẳng hạn như Managed Extensibility Framework(MEF)) và xây dựng xung quanh nó

Nếu bất kỳ giải pháp mới xuất hiện, tôi sẽ thêm chúng vào danh sách này. Câu trả lời sẽ được chuyển tới người có khả năng tốt nhất để biện minh cho giải pháp của họ (có thể có lợi thế và hạn chế)

Cảm ơn trước,
Tech thử nghiệm Dude

+0

Điều gì về MEF và MAF? Tôi không biết ý bạn là gì khi bạn nói về bản dịch, nhưng MEF và MAF (có thể được làm giàu với một số thứ DI thông thường) được tạo ra để xây dựng các ứng dụng tổng hợp. Bạn có thể muốn đọc lướt qua mã Prism (Composite WPF), toàn bộ nội dung là về các ứng dụng tổng hợp hay còn gọi là modules/plugins. Nếu bạn đang nói về các ứng dụng web, nguồn gốc của CMS CMS cũng có thể thú vị. Những kẻ này đã xây dựng một cơ sở hạ tầng plugin tốt đẹp trên đầu trang của ASP.NET MVC. – Jay

+0

Ứng dụng được đề cập là một dịch vụ web, đang ngồi trên máy chủ. Ý tưởng là nhiều người có thể cung cấp tệp cho 'dịch' và một số người có thể cung cấp plugin. Khi mọi người cung cấp tệp của họ, họ sẽ chọn plugin nào sẽ được sử dụng để 'dịch' chúng. Kết thúc giao diện người dùng thực tế (WPF, MVC, v.v.) không phải là vấn đề ngay bây giờ. Do đó, tôi đã tránh xa các khuôn khổ tiền giả mạo bởi vì chúng có xu hướng khá khó chịu. Sửa chữa cho tôi nếu tôi gặp lỗi –

+0

Chưa làm việc với MAF và không biết liệu nó có được duy trì bởi MS hay không nhưng tôi nghĩ ít nhất MEF nên cung cấp cơ sở hạ tầng cần thiết. Nó không giới hạn trong các công cụ GUI. Mặc dù tôi nghĩ rằng @Chris Shain là đúng, không sáng tạo lại bánh xe. BTW: Có gì về an ninh? Tôi có nghĩa là ai đó có thể tải lên mã độc hại dưới dạng plugin. Có vẻ như một sandbox là bắt buộc. – Jay

Trả lời

3

Ở cấp thấp nhất Tôi tin rằng bạn cần giao diện . Điều này cho phép hầu hết các khuôn khổ giả mạo dễ dàng cung cấp hàng giả. Xung quanh mã của bạn, bạn nên đi qua các giao diện. Nếu bạn cần một số cơ sở thực hiện có thể được cấu trúc lại thành một lớp cơ sở trừu tượng, sau đó làm điều đó. Các lớp và các giao diện cơ sở trừu tượng không phải là các khái niệm loại trừ lẫn nhau. Một số lần nó có ý nghĩa để có cả hai.

+0

Vì vậy, ví dụ, tôi sẽ có 'ITranslator', sau đó sẽ khai báo tất cả các phương thức hợp lệ để dịch và lớp trừu tượng TranslatorBase khai báo một số triển khai cơ bản. Vấn đề sau đó nảy sinh khi tôi bắt đầu sử dụng sự phản chiếu để tìm kiếm các triển khai bên trong DLL. Tôi chỉ tìm kiếm các triển khai 'ITranslator'? Hay tôi thực sự yêu cầu họ kế thừa 'TranslatorBase'? Nội dung nào trong số này là công khai và chỉ dành cho nội bộ để sử dụng? cảm ơn câu trả lời của bạn –

+0

Hãy cho tôi biết nếu bản chỉnh sửa tôi đã thực hiện cho câu hỏi có bao gồm đầy đủ câu trả lời của bạn –

3

Tôi không nghĩ rằng có một giải pháp tốt hơn giữa giao diện hoặc lớp trừu tượng, nó thực sự phụ thuộc vào những gì bạn cần. Nhưng nhân cách tôi có thể sẽ đi với lớp trừu tượng, cho thực tế đơn giản là nó cung cấp sự linh hoạt hơn.

Bạn có thể cung cấp một số abstract phương pháp là rất cần thiết để xác định hành vi cụ thể của các plugin, trong khi virtual phương pháp cung cấp một cách để optionnaly ghi đè lên một hành vi mặc định.

Lớp trừu tượng cũng có thể cung cấp một số phương pháp tiện ích có thể hữu ích cho tác giả của plugin.

Về cơ bản, lớp trừu tượng có thể cung cấp tất cả rằng phiếu mua hàng giao diện và hơn thế nữa. Vì vậy, nó có lẽ là một tốt hơn cho phần mở rộng trong tương lai.

+1

+1 để xác định ưu điểm của việc triển khai lớp trừu tượng –

4

Những gì bạn đang viết có vẻ nghi ngờ giống như những gì Managed Extensibility Framework hỗ trợ: http://mef.codeplex.com/. Có lẽ chỉ cần sử dụng và tránh tái phát minh ra bánh xe?

+0

Điều tra bây giờ ... Cảm ơn con trỏ –

+0

MEF sẽ là giải pháp tốt ở đây . + 1 –

+0

Một vài dòng mã có thể được sử dụng để triển khai công cụ plugin, xem http://www.c-sharpcorner.com/UploadFile/rmcochran/plug_in_architecture09092007111353AM/plug_in_architecture.aspx, một khung công tác nặng không phải lúc nào cũng bắt buộc – Aerospace