Plugin / architettura modulare: problemi di distribuzione

4

Sto sviluppando un'applicazione desktop in .Net che segue un'architettura di plugin, qualcosa del genere: -

Ho una soluzione "core" .Net, contenente il progetto desktop exe e una manciata di progetti di librerie di classi. Queste classi forniscono tutti i tipi di funzionalità condivise / comuni e sono referenziate dall'exe dell'applicazione e dai singoli moduli.

Ogni modulo vive nella propria soluzione .Net. La soluzione ha la sua copia delle DLL della libreria condivisa sopra indicate come riferimento del / i progetto / i del modulo.

L'installazione per l'utente finale richiede solo la distribuzione del core exe & DLL, insieme alle DLL dei moduli richieste in quel sito, in una cartella. Non ho alcun problema con il meccanismo utilizzato dal core exe per "scoprire" quali moduli sono presenti, quindi caricare & inizialo.

Le mie preoccupazioni riguardano la gestione e la distribuzione delle DLL. In un mondo ideale dovrei essere in grado di apportare una modifica al "modulo X" e ridistribuire solo le DLL di quel modulo. Tuttavia è possibile che una modifica possa anche comportare l'aggiornamento di una delle librerie condivise. Quando si ridistribuiscono queste DLL aggiornate, la funzionalità della libreria condivisa aggiornata potrebbe interrompere altri moduli (o anche l'exe dell'applicazione) che fanno riferimento a esso. Immagino che cosa dovrei fare in questo scenario è ricostruire / ridistribuire tutte soluzioni, non solo "modulo X".

Un approccio più semplice può essere quello di trattare il "core" e tutti i moduli come un singolo prodotto e ridistribuire tutto in ogni versione, anche se si tratta solo di una modifica a un modulo. Ma sembra che perderei uno dei vantaggi dell'architettura di un plugin: dovrei essere in grado di rilasciare una nuova versione di un modulo in isolamento.

Qualche idea? O questi problemi di referenziazione di DLL sono una parte inevitabile dell'utilizzo di un'architettura di plugin?

    
posta Andrew Stephens 18.11.2014 - 10:54
fonte

3 risposte

4

Vorrei adottare un approccio secondo cui le librerie condivise sono responsabili del core e che i moduli possono essere aggiornati come vogliono su base individuale, tranne quando ciò richiede un aggiornamento a una libreria condivisa.

Inoltre, vorrei tenere traccia delle versioni delle librerie mantenendo un numero di versione singolo per la piattaforma principale che viene incrementato ad ogni release e facendo in modo che i moduli sappiano quale versione core richiedono. Ciò renderebbe più semplice il rilevamento dei problemi relativi alla corrispondenza errata.

Il vantaggio di questo è che lo sviluppo dei moduli può continuare per lo più indipendentemente dalla piattaforma principale e l'un l'altro, si spera che solo con gli aggiornamenti occasionali richiesti al core.

    
risposta data 18.11.2014 - 11:30
fonte
2

Finché sei l'unico fornitore per tutti i "plug-in" e finché i moduli non hanno bisogno di centinaia di spazio su disco MB, ti suggerisco di mettere sempre tutte le DLL in ogni pacchetto rilasciato e trattare tutto come un unico prodotto, con un numero di versione. Ciò semplifica la distribuzione, poiché non è necessario disporre di pacchetti separati per gli aggiornamenti parziali e, se è necessaria una reinstallazione completa della versione più recente, è possibile utilizzare esattamente lo stesso pacchetto.

Tuttavia, se si utilizzerà l'architettura dei plugin per consentire ai moduli di ottenere il proprio ciclo di vita, in gran parte indipendenti dal core, pianificare i moduli come se fossero forniti da un altro fornitore. Assicurati che ci sia un'interfaccia stabile tra i moduli e il core e assicurati che le librerie dei moduli non entrino in collisione con le librerie del core (ad esempio, evita di installarle nella stessa cartella). Anche se hai una libreria condivisa che viene utilizzata nel core e riutilizzata in uno dei tuoi moduli, assicurati che il core e i moduli possano usare simultaneamente diverse versioni di quella libreria condivisa. E assicurati che il tuo prodotto e i tuoi moduli abbiano i loro numeri di versione. Quindi puoi distribuire il tuo core e i tuoi plugin separatamente.

La seconda opzione in genere richiede più sforzo nella gestione della configurazione rispetto alla prima, quindi solo "perché hai un'architettura plug-in e puoi trattare i tuoi moduli come prodotti diversi" non significa che devi farlo e perdere qualcosa di importante quando distribuisci tutto in un unico pacchetto.

    
risposta data 18.11.2014 - 23:41
fonte
1

Tre opzioni per te, scegli quella che ti piace di più:)

  1. Inietti qualsiasi dipendenza dal framework

    Quando il tuo framework istanzia il plugin, dovrebbe passare qualsiasi API framework necessaria al plugin come interfacce iniettate. In questo modo puoi essere certo che il plug-in stia utilizzando una versione compatibile con il tuo framework.

  2. Utilizza l'isolamento del processo

    Crea un'istanza di ciascun plug-in nel proprio processo. Anche se questo può sembrare eccessivo ridicolo, è anche dannatamente a prova di proiettile. Anche se il plug-in si blocca completamente, non eliminerà il tuo framework. È anche possibile avviare ciascun plug-in in un contesto utente diverso, che può anche aiutarti a proteggerti da plugin dannosi (vedi Principio di privilegio minimo ). Questa opzione consentirà ai plug-in di funzionare con versioni diverse delle stesse DLL e consentirà anche versioni diverse del framework .NET.

  3. Richiedi la certificazione del plugin

    Tutti i plugin devono essere inviati a un server (può essere automatizzato, se lo desideri) che "certifica" che la DLL è compatibile con il framework (magari con alcuni test di base automatizzati). Dopo che il plug-in è stato convalidato, può essere strongmente denominato e firmato con la tua chiave privata in modo che il framework possa dire se è stato manomesso. Modifica il tuo framework per consentire solo i plug-in firmati.

risposta data 08.03.2017 - 23:12
fonte

Leggi altre domande sui tag