Jak przejść do budowania oprogramowania, które można podłączyć?

20

Jeśli masz jakąś aplikację i chcesz, aby Twoi użytkownicy mogli pisać do niej wtyczki, jak powinna być zaprojektowana aplikacja?

Co musisz wziąć pod uwagę, jakie wzorce projektowe są w tym przypadku itp.?

użytkownik9238
źródło
Przychodzą na myśl takie wzorce, jak Obserwator, Pośrednik, Dowodzenie i Łańcuch Odpowiedzialności
Mchl
3
@Mchl: Prześlij swoją odpowiedź jako odpowiedź, a nie jako komentarz.
S.Lott,
Powinieneś spojrzeć na Mefa i informacje MSDN
Luc Bos
Wydaje
@Mchl: „niewystarczająco szczegółowe”? Więc po co w ogóle komentować? To wyraźnie odpowiedź. Proszę zamieścić odpowiedzi jako odpowiedzi.
S.Lott,

Odpowiedzi:

13

To zależy od twojej platformy, ale kilka ogólnych rzeczy, o których należy pamiętać

Przechowywanie wersji Co się stanie, jeśli zaktualizujesz aplikację, czy wszystkie stare wtyczki staną się przestarzałe (problem z firefoxem)

Izolacja Czy wtyczki mogą robić, co chcą? Czy zawsze im ufasz? A może musisz uruchomić je w piaskownicy i poprosić o uprawnienia.

Aktualizacje Jak radzisz sobie z aktualizacjami wtyczek?

Bezpieczeństwo W jaki sposób zapewnia się autorowi wtyczki, zapobiega fałszowaniu lub oszukaniu użytkownika w celu zainstalowania złośliwego kodu. Zwykle rozwiązywane przez podpisywanie kodu

Serializacja Często, gdy używasz pewnego rodzaju izolacji, musisz szeregować informacje między różnymi wątkami lub procesami. Jak to zrobić najbardziej wydajnie?

Rozszerzalność Jakie aspekty musisz rozszerzyć? Jak zmaksymalizować potencjał wtyczek bez niewygodnego działania interfejsu API.

Jeśli celujesz w zewnętrznych programistów do wtyczek, powiedziałbym, że najważniejszą rzeczą (z mojego doświadczenia) jest to, że API i klasy wtyczek są zupełnie inne niż w pozostałej części aplikacji, i ułatwienie programowania dla jak to możliwe. Architektura z głównej aplikacji jest bardzo łatwa do „przelania” się do wtyczek, dzięki czemu autorzy wtyczek muszą dowiedzieć się znacznie więcej niż muszą. Ułatw im to, zastanów się, jaki interfejs i doświadczenie chcesz mieć jako autor wtyczek.

Innym dobrym sposobem myślenia nie jest myślenie: „Wtyczka zrobi wszystkie te rzeczy (w kodzie), ale„ wtyczka musi podać te informacje ”. W ten sposób aplikacja może zużyć niezbędne informacje i wykonać rzeczywiste przetwarzanie, które uprości wtyczka.

Ogólnie rzecz biorąc, ilekroć możesz zastosować podejście opisowe (metadane, takie jak xml), a nie kod, masz dużą przewagę, ponieważ metadane są łatwiejsze do transportu, wersji, wdrażania, zabezpieczania i mogą być łatwiej skonfigurowane przez strony trzecie

Homde
źródło
1
+1 Nie odpowiada bezpośrednio na pytanie, ale są to ważne kwestie, o których należy pamiętać
Adriano Carneiro,
Wierzę, że te problemy są omówione, zanim ktokolwiek zacznie opracowywać faktyczny mechanizm rozszerzalności
Gus
9

Napisałem ten artykuł Code Project o używaniu MEF do rozszerzalności w .NET. To dobre wprowadzenie.

Istnieją inne struktury rozszerzalności dla platformy .NET, takie jak architektura dodatków SharpDevelop , Mono.Addins i System.AddIn .

W przypadku Javy istnieje architektura wtyczek Eclipse .

Ogólny wzór jest następujący:

  • Definiujesz umowę (zwykle interfejs) między hostem a rozszerzeniem
  • Potrzebujesz mechanizmu wykrywania, który wychodzi i szuka zainstalowanych rozszerzeń
  • Musisz być w stanie dynamicznie ładować rozszerzenia i uświadomić je hostowi

W praktyce ma wiele wspólnego z wtryskiem zależności i wzorcem strategii.

Scott Whitlock
źródło
+1 MEF i System.AddIn to dobre rzeczy do obejrzenia. Nawet jeśli ich nie użyjesz, oba mają dobre pomysły.
RationalGeek
@jkohlhepp - Zgadzam się, a także sugerowałbym głębokie zanurzenie się w architekturze SharpDevelop, ponieważ jest na ten temat dużo napisane, jest to oprogramowanie typu open source (podobnie jak MEF, btw) i jest dobrze zaprojektowane.
Scott Whitlock,
3

Musisz tylko zapewnić interfejs dla wtyczek.

Powinien zawierać co najmniej Metodę Aktywacji (punkt wejścia), ale będziesz chciał również takich rzeczy jak Inicjalizacja itp.

I powinna istnieć możliwość komunikacji z aplikacją hosta w sposób podobny do rejestru, na przykład w celu zarejestrowania pozycji menu. Dlatego należy zapewnić rejestr rzeczy, które można zmieniać / rozszerzać dla wtyczek.

Ponadto powinna istnieć dostępna pamięć dla danych i obiektów aplikacji hosta, aby wtyczki mogły wywoływać jej procedury. Można to łatwo zrobić, używając kontenera DI, takiego jak Unity, i zezwalając wtyczkom na dostęp do niego, aby mogli rozwiązać potrzebne usługi.

Agregator zdarzeń jest prawdopodobnie dobrym pomysłem, więc wtyczki mogą generować zdarzenia i reagować na zdarzenia z innych wtyczek i aplikacji hosta w sposób oddzielony od siebie. Zdecydowanie chcesz!

Sokół
źródło