Iedomājieties scenāriju, kurā mūsu pakalpojumu sistēma nodrošina virkni funkcionālu pakalpojumu, un nākotnē tiks pievienoti vairāk jaunu funkcionālo pakalpojumu, un funkcionālie pakalpojumi var būt jāmaina vai jānoņem. Kopīga pamatprasība šādai pakalpojumu sistēmai ir tāda, ka pakalpojumu sistēmas darbību nevar apturēt, pievienojot/noņemot/atjauninot funkcionālos pakalpojumus. Parasti "karstās maiņas spraudņus" var ļoti viegli ieviest, iekapsulējot katru pakalpojumu spraudņa dll, bet spraudņu "karstā nomaiņa" ("dinamiskā nomaiņa") kļūst par problēmu. Iemesls ir tāds, ka, atinstalējot spraudni Dll no pakalpojumu sistēmas, pakalpojumu sistēma faktiski joprojām satur pamatā esošo atsauci uz dll, un, ja mēģināt izdzēst vai pārrakstīt dll, logi sniegs ziņojumu, piemēram, "dll tiek izmantots".
Tātad, kā atrisināt šo problēmu? Es domāju, ka ir vismaz divas iespējas:
(1) Izmantojiet AppDomain. Ielādējot spraudņus jaunā AppDomain un pēc tam atinstalējot AppDomain, spraudņi tiek tīri izlādēti no pakalpojuma sistēmas. Šīs pieejas trūkums ir tas, ka jums ir jāpārvalda daudzi AppDomains (jo jums ir tik daudz funkcionālu pakalpojumu), un saziņa starp AppDomains tiek veikta attālinātā veidā, kas mūsu sistēmai rada daudz nevajadzīgu galvassāpju. Ja jūs interesē, varat arī izmēģināt šo iespēju, un es dodu priekšroku otrajam.
(2) Kopējiet spraudni Dll atmiņā un pēc tam ielādējiet Dll atmiņā. Tādā veidā cietā diska DLL var pārrakstīt vai izdzēst pēc vēlēšanās. Iepriekš mēs ielādējām spraudni Dll tieši no cietā diska, piemēram:
Tagad mums ir jāpagriež stūris:
Tas atrisina spraudņu "dinamiskās aizstāšanas" problēmu.
|