Bayangkan skenario di mana sistem layanan kami menyediakan serangkaian layanan fungsional, dan lebih banyak layanan fungsional baru akan ditambahkan di masa mendatang, dan layanan fungsional mungkin perlu diubah atau dihapus. Persyaratan dasar umum untuk sistem layanan semacam itu adalah bahwa pengoperasian sistem layanan tidak dapat dihentikan saat menambahkan/menghapus/memperbarui layanan fungsional. Biasanya, "plugin hot-swapping" dapat diimplementasikan dengan sangat mudah dengan merangkum setiap layanan ke dalam dll plugin, tetapi "penggantian panas" ("penggantian dinamis") plugin menjadi masalah. Alasannya adalah ketika kita menghapus plugin Dll dari sistem layanan, sistem layanan sebenarnya masih memegang referensi yang mendasari dll, dan jika Anda mencoba menghapus atau menimpa dll, windows akan memberikan pesan seperti "dll sedang digunakan".
Jadi bagaimana mengatasi masalah ini? Saya pikir setidaknya ada dua opsi:
(1) Gunakan AppDomain. Memuat plugin di AppDomain baru dan kemudian menghapus AppDomain dengan bersih membongkar dll plugin dari sistem layanan. Kelemahan dari pendekatan ini adalah Anda perlu mengelola banyak AppDomains (karena Anda memiliki begitu banyak layanan fungsional), dan komunikasi di seluruh AppDomains dilakukan dengan cara jarak jauh, yang menimbulkan banyak sakit kepala yang tidak perlu ke sistem kami. Jika Anda tertarik, Anda juga dapat mencoba opsi ini, dan saya lebih suka menggunakan yang kedua.
(2) Salin plugin Dll di memori, lalu muat Dll di memori. Dengan cara ini, DLL pada hard drive dapat ditimpa atau dihapus sesuka hati. Sebelumnya kami memuat plugin Dll langsung dari hard drive, seperti ini:
Sekarang, kita perlu berbelok di sudut:
Ini memecahkan masalah "penggantian dinamis" plugin.
|