Představte si scénář, kdy náš servisní systém poskytuje řadu funkčních služeb a v budoucnu budou přidány další nové funkční služby a funkční služby budou muset být změněny nebo odstraněny. Běžným základním požadavkem pro takový servisní systém je, že provoz servisního systému nelze zastavit při přidávání/odebírání/aktualizaci funkčních služeb. Obvykle lze "hot-swapping pluginy" implementovat velmi snadno tím, že se každá služba zapouzdří do pluginu dll, ale "hot replacement" ("dynamická náhrada") pluginů se stává problémem. Důvodem je, že když odinstalujeme plugin DLL ze servisního systému, servisní systém stále uchovává podkladovou referenci na DLL, a pokud se pokusíte DLL smazat nebo přepsat, Windows zobrazí zprávu typu "dll je používáno".
Jak tedy tento problém vyřešit? Myslím, že jsou alespoň dvě možnosti:
(1) Použijte AppDomain. Načtení pluginů v novém AppDomain a následné odinstalování AppDomain čistě odstraní dll pluginu ze servisního systému. Nevýhodou tohoto přístupu je, že musíte spravovat mnoho AppDomainů (protože máte tolik funkčních služeb) a komunikace napříč AppDomainy probíhá na dálku, což našemu systému přináší spoustu zbytečných komplikací. Pokud máte zájem, můžete zkusit i tuto možnost, a já preferuji druhou možnost.
(2) Zkopírovat plugin Dll do paměti a poté načíst Dll do paměti. Tímto způsobem lze DLL na pevném disku libovolně přepsat nebo smazat. Dříve jsme načítali plugin Dll přímo z pevného disku, takto:
Teď musíme otočit nový směr:
To řeší problém "dynamické náhrady" pluginů.
|