Imaginează-ți un scenariu în care sistemul nostru de servicii oferă o serie de servicii funcționale, iar în viitor vor fi adăugate mai multe servicii funcționale noi, iar serviciile funcționale ar putea necesita modificări sau eliminări. O cerință de bază comună pentru un astfel de sistem de servicii este ca funcționarea sistemului de servicii să nu poată fi oprită atunci când se adaugă/elimină/actualizează servicii funcționale. În mod normal, "pluginurile hot-swapping" pot fi implementate foarte ușor prin încapsularea fiecărui serviciu într-un DLL de pluginuri, dar "hot replacement" ("înlocuire dinamică") a pluginurilor devine o problemă. Motivul este că atunci când dezinstalăm un plugin DLL din sistemul de servicii, acesta păstrează de fapt referința de bază la dll, iar dacă încerci să ștergi sau să suprascrii dll-ul, Windows va afișa un mesaj de genul "dll este folosit".
Deci, cum pot rezolva această problemă? Cred că există cel puțin două opțiuni:
(1) Folosiți AppDomain. Încărcarea pluginurilor într-un nou AppDomain și apoi dezinstalarea AppDomain descarcă curat DLL-urile pluginurilor din sistemul de servicii. Dezavantajul acestei abordări este că trebuie să gestionezi multe AppDomain-uri (pentru că ai atât de multe servicii funcționale), iar comunicarea între AppDomain-uri se face la distanță, ceea ce introduce multe bătăi de cap inutile în sistemul nostru. Dacă ești interesat, poți încerca și această opțiune, iar eu prefer să folosesc a doua.
(2) Copiază DLL-ul pluginului în memorie, apoi încarcă DLL-ul în memorie. Astfel, DLL-urile de pe hard disk pot fi suprascrise sau șterse după bunul plac. Anterior, am încărcat pluginul Dll direct de pe hard disk, așa:
Acum, trebuie să facem o schimbare:
Aceasta rezolvă problema "înlocuirii dinamice" a pluginurilor.
|