Architektura wtyczek w aplikacjach internetowych (przykłady czy fragmenty kodu?)

Próbuję nauczyć się tworzyć aplikację internetową (najlepiej NodeJS / MongoDB, chociaż wcześniej używałem PHP i Pythona), która jest wysoce rozszerzalna i konfigurowalna za pomocą wtyczek, aby włączyć wyłączone funkcje.

Jedną z możliwych opcji jest użycie WordPressa z hookami dla wtyczek i widżetów do podłączenia, jednak brak właściwego oddzielenia widoku i kodu logicznego. To pozostaje jedną z opcji, z której można się uczyć. Są jakieś inne opcje?

Czy masz jakieś fragmenty kodu lub przykładowa aplikacja, z której mogę się uczyć? Język lub framework nie jest tak ważny, prawdopodobnie mógłbym z grubsza zrozumieć pojęcie za

Author: Martin Spamer, 2012-05-26

4 answers

Dobra architektura wtyczek jest trudna do osiągnięcia od zera, ale oferuje własne nagrody. Dzięki temu oprogramowanie jest elastyczne i łatwe w utrzymaniu dzięki lokalizacji złożoności. Najważniejszą umiejętnością, jakiej wymaga, jest umiejętność pisania luźno sprzężonego kodu . Wymaga to bardzo mocnego zrozumienia polimorfizmu, Prawa Demetera i pokrewnej Zasady Hollywood .

Polecam, aby początkowo zyskać dobrą znajomość tych, następnie następujący wzór wzory, które znacznie zmniejszą trudne:

  • wzorzec poleceń : daje modułom wtyczek spójny punkt wejścia, pozwalając na łatwą wymianę w I Na Zewnątrz, webowy przykład z IBM .
  • Memento : przechwytuje, utrzymuje i uzewnętrznia stan bez naruszania enkapsulacji, pozwala na konfigurację wtyczek przez kontener.
  • Call Back : umożliwia modułom wtyczek dostęp do "usług" z kontener/środowisko.
  • Dependency Injection : sposób na poluzowanie łączenia modułów wtyczek z ich środowiska.
  • Abstract Factory Pattern : Instalowanie i tworzenie instancji wtyczki w środowisku.
  • Builder Pattern : wymagany dla każdej nietrywialnej architektury wtyczek, w której Moduły wtyczek są od siebie zależne.

Po uchwyceniu tych, przestudiuj niektóre z istniejących implementacji frameworku wtyczek i architektury, aby zobaczyć, jak zostały wykorzystane. Apache ma kilka w Struts, Geronimo custom server assemblies i Tomcat JNDI Resources ; także Eclipse Plugin framework .

 60
Author: Martin Spamer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-15 20:19:38

Nie mamy architektury wtyczek jako takiej, ale wyjaśnię, w jaki sposób utrzymujemy nasz kod klienta luźno powiązany, i może to da ci kilka pomysłów.

Używamy asp.net dostarczamy główne.strona aspx, która najpierw zawiera plik javascript mediatora. Definiuje globalny obiekt-nazwijmy go mediatorem-który jest jedynym globalnym obiektem, który definiujemy.

Mediator udostępnia prosty interfejs z publikacją i subskrybowaniem wiadomości:

mediator.subscribe(messageName, callback);
mediator.publish(messageName);
Po mediatorze.js plik, Strona główna zawiera szereg innych plików javaScript, z których każdy składa się z funkcji natychmiastowej, która rejestruje jego funkcjonalność z mediatorem. Więcej o tym wzorze można znaleźć tutaj , lub zobaczyć moje poprzednie pytanie tutaj .

Można zastosować podobne podejście-zdefiniować pojedynczy globalny obiekt (powiedzmy pluginFramework), który oferuje interfejs dla wtyczek do rejestrowania ich funkcjonalności. Podczas budowania strony html, aby dostarczyć do klient, najpierw Dołącz plik pluginFramework, a następnie dynamicznie Dołącz żądane pliki wtyczek JavaScript, które mogą zależeć od użytkownika lub urządzenia(np. różne wtyczki, jeśli urządzenie jest włączone touch?). Te pliki wtyczki dodają swoją funkcjonalność do pluginFramework z natychmiastową funkcją.

Oto przykład jak zezwolić wtyczkom na dodawanie funkcjonalności do menu w UI:

PluginFramework.js:

var pluginFramework = (function() {
    var menuItems = [];
    function addMenuItemPrivate(itemName, callback) {
        // e.g. add itemName and callback to menuItems
    }
    return {
        addMenuItem: addMenuItemPrivate;
    }
})());

PhotoPlugin.js:

(function() {
    function addPhoto() {
        //...
    }
    pluginFramework.addMenuItem('add photo', addPhoto)
})());

Mam nadzieję, że to było w jakiś sposób pomocne!

 5
Author: GarethOwen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:17

Twój komentarz sugeruje, że to, co budujesz, jest architekturą multi-tenant .

Jest to złożony wymóg-i taki, który zwykle jest dość trudny do dopasowania; w dużej mierze zależy od tego, od czego zaczynasz.

Po pierwsze, musisz mieć przyzwoicie przemyślaną aplikację internetową; jeśli używasz frameworka MVC, masz punkt wyjścia.

Po drugie, musisz zdecydować, gdzie zamierzasz obsługiwać rozszerzenia; dla instace, można Klient ma całkowicie oddzielną skórkę dla swojego interfejsu? Jeśli tak, potrzebujesz ramy skórowania. Klienci mogą zmienić wszystko lub po prostu podłączyć różne komponenty w kluczowych punktach (np. Niestandardowy dostawca płatności lub niestandardowy schemat uwierzytelniania). O wiele łatwiej jest obsługiwać ograniczony zestaw punktów rozszerzeń niż projektować framework, który pozwala na rozszerzenie czegokolwiek.

Następnie Twoja strategia danych; jest dobry artykuł na temat multi tenancy na MSDN ; jest nastawiony na relacyjne bazy danych, ale dostarcza pomysłów, które można zastosować do Mongo.

Wreszcie, musisz wymyślić architekturę komponentów, która obsługuje punkty rozszerzeń, których potrzebujesz. Ponieważ masz do czynienia z aplikacją internetową, musisz być w stanie modyfikować Model, widok, kontroler i persistance; najlepszym rozwiązaniem jest użycie sposobu, w jaki Framework MVC chce działać, i umieścić logikę "dla dzierżawcy x, do y; dla dzierżawcy z, do w" w warstwie kontrolera. Baw się tym, spraw, aby działało w niektórych przypadkach, których potrzebujesz, a potem zastanów się, co w tym złego i napraw to.

 4
Author: Neville Kuyt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-07 12:13:59

Jeśli sam robisz personalizację klienta, Django brzmi idealnie do tego. Stwórz swoją podstawową aplikację, która obsługuje wszystkie podstawowe funkcje, które chcesz. Następnie dla każdej logicznie oddzielonej rzeczy, którą musisz zrobić/wtyczka, Utwórz nową aplikację, którą możesz podłączyć do głównej, po prostu dodając tę aplikację do zainstalowanych aplikacji w Ustawieniach.

To obsługuje skórowanie (po prostu plop w nowym miejscu base_site.szablon html, niech wszystkie pozostałe odziedziczą po nim), obsługa wielu baz danych, wtyczek, i daje możliwość dość szybko rozwijać i wdrażać nowe wtyczki / funkcje.

Zobacz merengue lub pinax aby uzyskać bardziej ogólne przykłady tego, czym może być twój wewnętrzny system.

 0
Author: Murph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-08 15:21:20