Immaginate uno scenario in cui il nostro sistema di servizi fornisce una serie di servizi funzionali, e in futuro verranno aggiunti nuovi servizi funzionali, e i servizi funzionali potrebbero dover essere modificati o rimossi. Un requisito di base comune per un sistema di servizio di questo tipo è che il funzionamento del sistema di servizio non possa essere fermato quando si aggiungono/rimuovono/aggiornano servizi funzionali. Normalmente, i "hot-swapping" plugin possono essere implementati molto facilmente incapsulando ogni servizio in un plugin dll, ma la "hot replacement" ("sostituzione dinamica") dei plugin diventa un problema. Il motivo è che quando disinstalliamo un plugin Dll dal sistema di servizio, il sistema di servizio mantiene comunque il riferimento sottostante alla DLL, e se provi a cancellare o sovrascrivere la DLL, Windows ti dà un messaggio tipo "la dll è in uso".
Allora, come risolvere questo problema? Penso che ci siano almeno due opzioni:
(1) Usa AppDomain. Caricare plugin in un nuovo AppDomain e poi disinstallare l'AppDomain scarica pulitamente le DLL dei plugin dal sistema di servizio. Lo svantaggio di questo approccio è che devi gestire molti AppDomain (perché hai così tanti servizi funzionali), e la comunicazione tra AppDomain avviene in modo remoto, il che introduce molti problemi inutili al nostro sistema. Se sei interessato, puoi provare anche questa opzione, e io preferisco usare la seconda.
(2) Copia il plugin Dll in memoria, e poi carica il Dll in memoria. In questo modo, le DLL sull'hard disk possono essere sovrascritte o cancellate a piacimento. In precedenza abbiamo caricato il plugin Dll direttamente dall'hard disk, così:
Ora, dobbiamo girare un angolo:
Questo risolve il problema della "sostituzione dinamica" dei plugin.
|