Уявіть собі сценарій, коли наша система обслуговування надає низку функціональних сервісів, і в майбутньому буде додано ще більше нових функціональних сервісів, і функціональні сервіси можуть знадобитися змінити або прибрати. Поширеною базовою вимогою для такої сервісної системи є те, що її роботу не можна зупинити при доданні/видаленні/оновленні функціональних сервісів. Зазвичай «плагіни для гарячої заміни» можна реалізувати дуже просто, інкапсулюючи кожен сервіс у плагін-dll, але «гаряча заміна» («динамічна заміна») плагінів стає проблемою. Причина в тому, що коли ми видаляємо плагін Dll із сервісної системи, сервісна система все ще зберігає базове посилання на DLL, і якщо ви спробуєте видалити або перезаписати DLL, Windows з'явиться повідомлення на кшталт «використовується DLL».
Отже, як вирішити цю проблему? Я думаю, є принаймні два варіанти:
(1) Використовуйте AppDomain. Завантаження плагінів у новий AppDomain і подальше видалення AppDomain чисто видаляє плагін dll з сервісної системи. Недоліком цього підходу є те, що потрібно керувати багатьма AppDomains (бо у вас дуже багато функціональних сервісів), а комунікація між AppDomains здійснюється віддалено, що створює багато зайвих проблем у нашій системі. Якщо цікаво, можете спробувати цей варіант, а я віддаю перевагу другому.
(2) Скопіюйте плагін Dll у пам'ять, а потім завантажте Dll у пам'ять. Таким чином, DLL на жорсткому диску можна перезаписувати або видаляти за бажанням. Раніше ми завантажували плагін Dll безпосередньо з жорсткого диска, ось так:
Тепер нам потрібно змінити ситуацію:
Це вирішує проблему «динамічної заміни» плагінів.
|