(#^$@(*&^#(*&^$#(*&@ β μόλις έχασα τις 3 σελίδες που είχα γράψει!
Το θέμα του extensibility μίας εφαρμογής έχει πολλές παραμέτρους. Isolation μεταξύ host application και modules, ασφάλεια, versioning, ταχύτητα, εντοπισμός των addins, lifecycle (πότε φορτώνω-σκοτώνω το addin) κλπ. Γι αυτό και η απλοϊκή λύση του "το κάνω μόνος μου" μπορεί να οδηγήσει σε προβλήματα.
Πολύ επιγραμματικά, υπάρχουν 3 κατηγορίες λύσεων:
- Να χρησιμοποιήσεις κάποιο μηχανισμό addin όπως το MEF ή το System.AddIn (σύντομη περιγραφή εδώ, samples - tools εδώ) το οποίο παρέχεται από το .NET 3.5. Το MEF είναι ευκολότερο στη χρήση, το System.AddIn θέλει λίγο κώδικα με το χέρι αλλά έρχεται με το runtime.
Είναι κατάλληλα όταν ξέρεις χονδρικά τί θα κάνει το addin σου, πχ. spell checking, νέος αλγόριθμος κλπ.
Παρέχουν isolation μεταξύ εφαρμογής και addins, μηχανισμούς εντοπισμού και φορτώματος των addin, lifecycle management (πότε ανεβαίνει-πέφτει το addin), versioning (επικοινωνία διαφορετικών εκδόσεων εφαρμογής-addin μεταξύ τους).
Κλασσική λύση, από τον καιρό του Photoshop 1.0 (νομίζω)
- Να χρησιμοποιήσεις κάποιο IoC container όπως τα Unity, Castle Windsor, Spring.NET. Δεν παρέχουν isolation κλπ αλλά γενικά είναι ευκολότερα στη χρήση. Και πάλι είναι κατάλληλα όταν η εφαρμογή σου ξέρει τί περιμένει να βρει στα addins. Συνήθως ορίζεις τα addin σε κάποιο config file, αλλά είναι εύκολο να φορτώσεις π.χ. όλα τα διαθέσιμα addin γράφοντας λίγο παραπάνω κώδικα.
Κατάλληλο όταν θέλεις να φτιάξεις ένα απλό και γρήγορο μηχανισμό addin και είσαι σίγουρος ότι δεν θα χρειαστείς isolation κλπ.
- Να χρησιμοποιήσεις ένα extensibility framework όπως το Prism ή το XAF, τα οποία περικλείουν ολόκληρους τομείς functionality σε modules, με τις φόρμες, μενού, κώδικα που απαιτούν. Ουσιαστικά η εφαρμογή μετατρέπεται σε host των modules, κάτι που επιτρέπει να αναπτύξεις κάθε module ανεξάρτητα αλλά και να δημιουργήσεις διαφόρους συνδυασμούς modules
Κατάλληλο για περίπλοκες εφαρμογές, π.χ. ERP, CRM και όπου χρειάζεται ή μπορεί να σπάσει η εφαρμογή σε ανεξάρτητα modules. Η μόδα του παρόντος και μέλλοντος σε αυτό τον τομέα.
Την περίπτωση να γράψεις με το χέρι τον κώδικα για να φορτώνεις τα dll, να ψάχνεις τα interfaces κλπ δεν θα τη συνιστούσα σε καμμία περίπτωση. Θα αντιμετωπίσεις προβλήματα τα οποία είναι ήδη λυμμένα, ενώ είναι σίγουρο ότι όσο ασχολείσαι π.χ. με το σκάσιμο του host, θα σου ξεφύγουν σημαντικά θέματα όπως το isolation και το performance. Σίγουρα έχει ενδιαφέρον να ασχοληθείς με αυτά τα θέματα σαν χόμπυ, όχι όμως όταν σε κυνηγούνε deadlines και αφεντικά.
Η επιλογή σου εξαρτάται από τις απαιτήσεις της εφαρμογής σου. Πριν επιλέξεις λύση θα πρέπει να σκεφτείς και να αναλύσεις (ή να μας πεις) τί απαιτήσεις θα έχει η εφαρμογή σου και μετά να δεις τί λύση ταιριάζει.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos