Φανταστείτε ένα σενάριο όπου το σύστημα υπηρεσιών μας παρέχει μια σειρά λειτουργικών υπηρεσιών και περισσότερες νέες λειτουργικές υπηρεσίες θα προστεθούν στο μέλλον και οι λειτουργικές υπηρεσίες μπορεί να χρειαστεί να αλλάξουν ή να αφαιρεθούν. Μια κοινή βασική απαίτηση για ένα τέτοιο σύστημα υπηρεσιών είναι ότι η λειτουργία του συστήματος υπηρεσιών δεν μπορεί να διακοπεί κατά την προσθήκη/αφαίρεση/ενημέρωση λειτουργικών υπηρεσιών. Κανονικά, τα "hot-swapping plugins" μπορούν να υλοποιηθούν πολύ εύκολα ενσωματώνοντας κάθε υπηρεσία σε ένα πρόσθετο dll, αλλά η "hot replacement" ("δυναμική αντικατάσταση") των plugins γίνεται πρόβλημα. Ο λόγος είναι ότι όταν απεγκαθιστούμε ένα πρόσθετο Dll από το σύστημα υπηρεσιών, το σύστημα υπηρεσιών στην πραγματικότητα εξακολουθεί να διατηρεί την υποκείμενη αναφορά στο dll και αν προσπαθήσετε να διαγράψετε ή να αντικαταστήσετε το dll, τα παράθυρα θα δώσουν ένα μήνυμα όπως "το dll χρησιμοποιείται".
Πώς λοιπόν να λύσετε αυτό το πρόβλημα; Νομίζω ότι υπάρχουν τουλάχιστον δύο επιλογές:
(1) Χρησιμοποιήστε το AppDomain. Η φόρτωση προσθηκών σε ένα νέο AppDomain και στη συνέχεια η απεγκατάσταση του AppDomain καταργεί καθαρά τη φόρτωση των dll προσθηκών από το σύστημα υπηρεσιών. Το μειονέκτημα αυτής της προσέγγισης είναι ότι πρέπει να διαχειριστείτε πολλά AppDomains (επειδή έχετε τόσες πολλές λειτουργικές υπηρεσίες) και η επικοινωνία μεταξύ των AppDomains γίνεται με τρόπο απομακρυσμένης, γεγονός που εισάγει πολλούς περιττούς πονοκεφάλους στο σύστημά μας. Αν σας ενδιαφέρει, μπορείτε επίσης να δοκιμάσετε αυτήν την επιλογή και προτιμώ να χρησιμοποιήσω τη δεύτερη.
(2) Αντιγράψτε το πρόσθετο Dll στη μνήμη και, στη συνέχεια, φορτώστε το Dll στη μνήμη. Με αυτόν τον τρόπο, τα DLL στον σκληρό δίσκο μπορούν να αντικατασταθούν ή να διαγραφούν κατά βούληση. Προηγουμένως φορτώσαμε το πρόσθετο Dll απευθείας από τον σκληρό δίσκο, ως εξής:
Τώρα, πρέπει να στρίψουμε στη γωνία:
Αυτό λύνει το πρόβλημα της «δυναμικής αντικατάστασης» των προσθηκών.
|