Forestil dig et scenarie, hvor vores servicesystem leverer en række funktionelle tjenester, og flere nye funktionelle tjenester vil blive tilføjet i fremtiden, og funktionelle tjenester kan være nødt til at ændres eller fjernes. Et almindeligt grundlæggende krav for et sådant servicesystem er, at driften af servicesystemet ikke kan stoppes, når funktionelle tjenester tilføjes/fjernes/opdateres. Normalt kan "hot-swapping plugins" implementeres meget nemt ved at indkapsle hver service i en plugin-dll, men "hot replacement" ("dynamisk udskiftning") af plugins bliver et problem. Årsagen er, at når vi afinstallerer en plugin-dll fra servicesystemet, holder servicesystemet faktisk stadig den underliggende reference til dll'en, og hvis du prøver at slette eller overskrive dll'en, vil Windows give en besked som "dll'en bliver brugt".
Så hvordan løser man dette problem? Jeg tror, der er mindst to muligheder:
(1) Brug AppDomain. Indlæsning af plugins i et nyt AppDomain og derefter afinstallation af AppDomain fjerner plugin-dll'erne rent fra servicesystemet. Ulempen ved denne tilgang er, at du skal administrere mange AppDomains (fordi du har så mange funktionelle tjenester), og kommunikationen på tværs af AppDomains foregår på en fjernforbindelsesmåde, hvilket medfører mange unødvendige hovedpiner i vores system. Hvis du er interesseret, kan du også prøve denne mulighed, og jeg foretrækker at bruge den anden.
(2) Kopier plugin-Dll'en i hukommelsen, og indlæs derefter Dll'en i hukommelsen. På denne måde kan DLL'erne på harddisken overskrives eller slettes efter behag. Tidligere indlæste vi plugin Dll direkte fra harddisken, sådan her:
Nu skal vi vende et hjørne:
Dette løser problemet med "dynamisk udskiftning" af plugins.
|