Sistema di plug-in dell'applicazione - interfacce - aggiunta di nuove funzionalità

2

Immagina di avere un'applicazione, che ha un sistema di plugin.

  public class MyPlugin : Plugin
  {
        public override ExecuteImpl (Context ctx)
        {
              // do something...
        }
  }

Ora sto aggiornando la mia applicazione alla versione 2.0 con un migliore sistema di plugin.
Dovrei creare il plugin Plugin2 e scrivere l'adattatore che permette di usare Plugin come Plugin2,
oppure posso fare qualcosa di simile a questo:

  public class MyPlugin : Plugin, IApiNewFeatures
  {
        public override ExecuteImpl (Context ctx)
        {
              // do something...
        }

        public void ExecuteNewApiFeatures () { ... }
  }

E nella mia app:

  if (myPlugin is IApiNewFeatures) { ... }

È una buona architettura? L'aggiunta di nuove interfacce è più semplice, soprattutto quando l'applicazione che utilizza i plug-in appartiene a qualcun altro e non voglio infastidirgli il codice.

    
posta zgnilec 05.05.2015 - 17:32
fonte

1 risposta

2

Non penso che sia una "o o" domanda e puoi evitare di sporcare il tuo codice con

if (myPlugin is IApiNewFeatures) { ... }

Passi:

  • Definisci IPlugin con (le parti essenziali di) l'interfaccia pubblica della tua attuale classe Plugin.
  • Inserisci IPlugin con il proprio file sorgente.
  • Sposta il file sorgente della classe Plugin in una cartella diversa (spazio dei nomi) in modo che non sia più disponibile. Quindi modifica il codice corrente per utilizzare i riferimenti IPlugin (anziché i riferimenti ai plugin) e fornisci solo discendenti del plug-in con accesso al file sorgente della classe Plugin.

Fai questo prima per avviare il nuovo sistema di plugin. Ciò assicurerà che il tuo vecchio codice non debba essere modificato a meno che non richieda realmente funzionalità dal nuovo sistema di plugin.

Per il tuo nuovo sistema di plugin

  • Definisci IPlugin2.
  • Ne fanno un discendente di IPlugin. Aggiungi i metodi che supportano le nuove funzionalità API.
  • Crea Plugin2, discendente dal Plugin e implementando IPlugin2.

Derivando Plugin2 dal Plugin assicura che i metodi IPlugin (che fanno parte di IPlugin2 per via ereditaria) siano già implementati. Implementa i nuovi metodi IPlugin2.

Tutto il tuo nuovo codice può funzionare con i riferimenti IPlugin2 e non prestare attenzione al fatto che il comportamento provenga dal nuovo o dal vecchio sistema di plugin. Dopotutto un riferimento IPlugin2 è anche un riferimento IPlugin.

Il vecchio codice che richiede funzionalità dal nuovo sistema di plugin può ora essere semplicemente modificato per utilizzare un riferimento IPlugin2 invece di uno IPlugin. Il codice che utilizza i metodi di Plugin / IPlugin funzionerà ancora - dopo tutto (I) Plugin2 è (I) Plugin - e il codice nuovo / modificato ora ha anche la nuova funzionalità a portata di mano.

    
risposta data 09.05.2015 - 21:10
fonte

Leggi altre domande sui tag