Kuvittele tilanne, jossa palvelujärjestelmämme tarjoaa sarjan toiminnallisia palveluita, ja tulevaisuudessa lisätään uusia toiminnallisia palveluita, ja toiminnallisia palveluita saattaa joutua muuttamaan tai poistamaan. Yleinen perusvaatimus tällaiselle palvelujärjestelmälle on, että palvelujärjestelmän toimintaa ei voida pysäyttää, kun toiminnallisia palveluita lisätään, poistetaan tai päivitetään. Normaalisti "hot-swap-pluginit" voidaan toteuttaa hyvin helposti kapseloimalla jokainen palvelu plugin dll:ään, mutta "hot replacement" ("dynaaminen korvaus") plugineissa muodostuu ongelmaksi. Syynä on se, että kun poistamme lisäosan DLL:n palvelujärjestelmästä, palvelujärjestelmä säilyttää edelleen taustaviitteen dll:ään, ja jos yrität poistaa tai korvata dll:n, Windows antaa viestin kuten "dll:ää on käytössä".
Miten tämä ongelma sitten ratkaistaan? Luulen, että vaihtoehtoja on ainakin kaksi:
(1) Käytä AppDomainia. Lisäosien lataaminen uuteen AppDomainiin ja sitten AppDomainin poistaminen poistaa pluginit palvelujärjestelmästä. Tämän lähestymistavan haittapuolena on, että sinun täytyy hallita monia AppDomaineja (koska sinulla on niin paljon toiminnallisia palveluita), ja AppDomainien välinen viestintä tapahtuu etänä, mikä aiheuttaa järjestelmällemme paljon tarpeettomia päänsärkyjä. Jos olet kiinnostunut, voit kokeilla tätä vaihtoehtoa, ja itse suosin toista.
(2) Kopioi plugin Dll muistiin ja lataa sitten Dll muistiin. Näin kovalevyn DLL:t voidaan korvata tai poistaa halutessaan. Aiemmin latasimme plugin DLL:n suoraan kovalevyltä, näin:
Nyt meidän täytyy kääntää kulma:
Tämä ratkaisee lisäosien "dynaamisen korvaamisen" ongelman.
|