Képzeljük el egy olyan helyzetet, amikor a szolgáltatási rendszerünk egy sor funkcionális szolgáltatást kínál, és a jövőben további új funkcionális szolgáltatásokat adnak hozzá, és előfordulhat, hogy a funkcionális szolgáltatásokat módosítani vagy eltávolítani kell. Egy ilyen szolgáltatási rendszer alapvető követelménye, hogy a szolgáltatási rendszer működését nem lehet megállítani funkcionális szolgáltatások hozzáadásakor, eltávolítása vagy frissítése során. Általában a "hot-swapping pluginok" nagyon könnyen megvalósíthatók, ha minden szolgáltatást egy plugin dll-be kapszulálnak, de a "hot replacement" ("dinamikus helyettesítés") problémát jelent. Ennek oka, hogy amikor eltávolítunk egy bővítmény DLL-t a szolgáltatási rendszerből, a szolgáltatási rendszer valójában még mindig megőrzi a DLL-re vonatkozó alaphivatkozást, és ha megpróbálod törölni vagy felülírni a dll-t, a Windows olyan üzenetet ad, mint például: "a dll használatban van".
Hogyan lehet ezt a problémát megoldani? Szerintem legalább két lehetőség van:
(1) Használd az AppDomain-t. Ha új AppDomainbe töltünk plugineket, majd eltávolítjuk az AppDomaint, akkor tisztán eltávolítjuk a plugin dll-eket a szolgáltatási rendszerről. Ennek a megközelítésnek az a hátránya, hogy sok AppDomain-et kell kezelni (mert rengeteg funkcionális szolgáltatásod van), és az AppDomainek közötti kommunikáció távoli módon zajlik, ami sok felesleges fejfájást okoz a rendszerünknek. Ha érdekel, ezt az opciót is kipróbálhatod, én inkább a másodikat választom.
(2) Másold le a plugin Dll-t a memóriába, majd töltsd be a Dll-t a memóriába. Így a merevlemezen lévő DLL-ek tetszés szerint felülírhatók vagy törölhetők. Korábban közvetlenül a merevlemezről töltöttük be a plugin DLL-t, így:
Most fordulnunk kell egy sarkon:
Ez megoldja a pluginek "dinamikus cseréje" problémáját.
|