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.?
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.?
Odpowiedzi:
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
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:
W praktyce ma wiele wspólnego z wtryskiem zależności i wzorcem strategii.
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!