Predstavte si scenár, kde náš servisný systém poskytuje sériu funkčných služieb a v budúcnosti budú pridané ďalšie nové funkčné služby a funkčné služby budú potrebné meniť alebo odstraňovať. Bežnou základnou požiadavkou takéhoto servisného systému je, že prevádzku servisného systému nie je možné zastaviť pri pridávaní/odstraňovaní/aktualizácii funkčných služieb. Normálne sa "hot-swapping pluginy" dajú veľmi jednoducho implementovať zapuzdrením každej služby do pluginu dll, ale "hot replacement" ("dynamická náhrada") pluginov sa stáva problémom. Dôvod je ten, že keď odinštalujeme plugin DLL zo servisného systému, servisný systém stále uchováva podkladovú referenciu na dll, a ak sa pokúsite DLL vymazať alebo prepísať, Windows zobrazí správu ako "dll sa používa".
Ako teda tento problém vyriešiť? Myslím, že existujú aspoň dve možnosti:
(1) Použite AppDomain. Načítanie pluginov v novom AppDomain a následné odinštalovanie AppDomain čisto odpojí DLL pluginu zo servisného systému. Nevýhodou tohto prístupu je, že musíte spravovať veľa AppDomainov (pretože máte toľko funkčných služieb) a komunikácia naprieč AppDomains prebieha na diaľku, čo prináša do nášho systému veľa zbytočných starostí. Ak máš záujem, môžeš skúsiť aj túto možnosť, a ja preferujem druhú.
(2) Skopírovať plugin Dll v pamäti a potom načítať Dll v pamäti. Týmto spôsobom je možné DLL na pevnom disku kedykoľvek prepísať alebo vymazať. Predtým sme načítavali plugin DLL priamo z pevného disku, takto:
Teraz musíme zmeniť smer:
Tým sa rieši problém "dynamickej náhrady" pluginov.
|