Представете си сценарий, в който нашата система за услуги предоставя серия от функционални услуги, а в бъдеще ще бъдат добавени още нови функционални услуги, като функционалните услуги може да се наложи да бъдат променени или премахнати. Често срещано основно изискване за такава система за услуги е, че работата на системата не може да бъде прекратена при добавяне/премахване/актуализиране на функционални услуги. Обикновено "hot-swapping плъгините" могат да се реализират много лесно чрез капсулиране на всяка услуга в dll за плъгини, но "гореща замяна" ("динамична замяна") на плъгини става проблем. Причината е, че когато деинсталираме плъгин Dll от сервизната система, системата на услугата все още държи основната препратка към DLL, и ако опитате да изтриете или презапишете DLL, Windows ще издаде съобщение като "използва се dll".
Как да решим този проблем? Мисля, че има поне две опции:
(1) Използвайте AppDomain. Зареждането на плъгини в нов AppDomain и след това деинсталирането на AppDomain чисто премахва dll-овете на плъгина от сервизната система. Недостатъкът на този подход е, че трябва да управлявате много AppDomains (защото имате толкова много функционални услуги), а комуникацията между AppDomains се осъществява дистанционно, което въвежда много ненужни главоболия в нашата система. Ако се интересувате, можете да пробвате и тази опция, а аз предпочитам втория.
(2) Копирай плъгина Dll в паметта и след това зареди Dll в паметта. По този начин DLL-овете на твърдия диск могат да бъдат презаписвани или изтривани по желание. Преди това зареждахме плъгина Dll директно от твърдия диск, по този начин:
Сега трябва да обърнем ъгъла:
Това решава проблема с "динамичната замяна" на плъгини.
|