Kujutage ette olukorda, kus meie teenusesüsteem pakub mitmeid funktsionaalseid teenuseid ning tulevikus lisandub veel uusi funktsionaalseid teenuseid ning funktsionaalseid teenuseid võib vajada muutmist või eemaldamist. Sellise teenusesüsteemi tavaline põhinõue on, et teenuse süsteemi tööd ei saa peatada funktsionaalsete teenuste lisamisel, eemaldamisel või uuendamisel. Tavaliselt saab "hot-swapping pluginaid" väga lihtsalt rakendada, kapseldades iga teenuse plugina DLL-i, kuid pluginate "hot replacement" ("dünaamiline asendus") muutub probleemiks. Põhjus on selles, et kui me desinstallime plugina DLL-i teenusesüsteemist, hoiab teenusesüsteem tegelikult endiselt DLL-i aluseks olevat viidet ja kui üritad DLL-i kustutada või üle kirjutada, annab Windows teate nagu "dll on kasutusel".
Kuidas siis seda probleemi lahendada? Arvan, et on vähemalt kaks võimalust:
(1) Kasuta AppDomaini. Pluginate laadimine uude AppDomaini ja seejärel AppDomaini desinstallimine eemaldab pluginad DLL-id puhtalt teenusesüsteemist. Selle lähenemise miinus on see, et pead haldama palju AppDomaine (sest sul on nii palju funktsionaalseid teenuseid) ning suhtlus AppDomainide vahel toimub kaugjuhtimise teel, mis tekitab meie süsteemile palju tarbetuid peavalusid. Kui oled huvitatud, võid proovida ka seda võimalust, mina eelistan teist varianti.
(2) Kopeeri plugin Dll mällu ja laadi Dll mällu. Nii saab kõvaketta DLL-e soovi korral üle kirjutada või kustutada. Varem laadisime plugina DLL-i otse kõvakettalt, umbes nii:
Nüüd peame pöörde pöörama:
See lahendab pluginate "dünaamilise asenduse" probleemi.
|