Προγραμματισμός

Πώς να εργαστείτε με το Managed Extensibility Framework στο C #

Το MEF (Managed Extensibility Framework) είναι ένα στοιχείο που συνοδεύεται από το .Net Framework 4 (ή πέρα ​​από αυτό) και σας βοηθά να δημιουργήσετε εφαρμογές που είναι ελαφριές και επεκτάσιμες υιοθετώντας μια χαλαρά συνδεδεμένη αρχιτεκτονική τύπου plugin. Μπορείτε να επωφεληθείτε από αυτό το πλαίσιο για να ανακαλύψετε και να αξιοποιήσετε τις επεκτάσεις χωρίς να χρειάζεστε οποιαδήποτε διαμόρφωση. Με τη χρήση MEF μπορείτε να βελτιώσετε την ευελιξία, τη συντήρηση και τη δυνατότητα δοκιμής των εφαρμογών σας με ευκολία. Όταν χρησιμοποιείτε MEF, μπορείτε να επαναχρησιμοποιήσετε τις επεκτάσεις εντός της ίδιας εφαρμογής ή, ακόμη και σε όλες τις εφαρμογές.

Το MSDN δηλώνει: "Το Managed Extensibility Framework ή MEF είναι μια βιβλιοθήκη για τη δημιουργία ελαφρών, επεκτάσιμων εφαρμογών. Επιτρέπει στους προγραμματιστές εφαρμογών να ανακαλύπτουν και να χρησιμοποιούν επεκτάσεις χωρίς να απαιτείται διαμόρφωση. Επιτρέπει επίσης στους προγραμματιστές επέκτασης να ενσωματώνουν εύκολα κώδικα και να αποφεύγουν εύθραυστες σκληρές εξαρτήσεις. όχι μόνο επιτρέπει την επέκταση των επεκτάσεων εντός εφαρμογών, αλλά και σε όλες τις εφαρμογές. "

DI, IoC και MEF

Το DI (Dependency Injection) είναι μια υλοποίηση της αρχής του IoC (Inversion of Control). Δηλώνει ότι όταν ένα αντικείμενο εξαρτάται από άλλα αντικείμενα, τέτοια αντικείμενα πρέπει να δημιουργούνται χρησιμοποιώντας ξεχωριστό πλαίσιο ή στοιχείο. Παρόλο που το IoC είναι η ικανότητα τροποποίησης της εκτέλεσης μιας σύμβασης, το DI είναι η ικανότητα να παρέχει την απαραίτητη εφαρμογή όταν ζητείται. Λάβετε υπόψη ότι πρέπει να χρησιμοποιείτε κοντέινερ IoC όταν οι εξαρτήσεις σας είναι στατικές - εάν είναι δυναμικές, το MEF είναι πολύ πιο χρήσιμο. Βασικά, τα κοντέινερ DI παρέχουν υποστήριξη για σύνθεση αντικειμένων, διαχείριση διάρκειας ζωής και παρακολούθηση.

Σε αντίθεση με ένα τυπικό δοχείο έγχυσης εξάρτησης όπως το Unity, NInject, το Castle Windsor MEF παρέχει υποστήριξη μόνο για τη σύνθεση αντικειμένων. Το MEF σάς παρέχει έναν τρόπο επέκτασης προσθηκών - μια δυνατότητα για την οποία δεν υποστηρίζονται τα τυπικά κοντέινερ IOC.

Το MEF είναι μια διαχειριζόμενη βιβλιοθήκη που περιλαμβάνεται ως μέρος των πρόσφατων εκδόσεων του .Net Framework (δεδομένου ότι το .Net Framework 4 είναι πιο ακριβές) για να ανακαλύψετε επεκτάσεις μέσω σύνθεσης χωρίς την ανάγκη διαμόρφωσης. Ένα συστατικό στο MEF είναι γνωστό ως μέρος. Ένα μέρος καθορίζει τις εξαρτήσεις και τις δυνατότητές του δηλωτικά. Αυτές οι εξαρτήσεις είναι γνωστές ως "Εισαγωγές" και οι δυνατότητες αντιπροσωπεύονται μέσω "Εξαγωγές". Σημειώστε ότι ένα μέρος πρέπει να έχει ένα χαρακτηριστικό "Εξαγωγή".

Ξεκινώντας

Όταν εργάζεστε με MEF, μπορείτε να χρησιμοποιήσετε οποιαδήποτε από τις δύο προσεγγίσεις. Αυτές περιλαμβάνουν: προσεγγίσεις βάσει χαρακτηριστικών και βάσει συμβάσεων. Όταν χρησιμοποιείτε το πρώτο, συνήθως θα επωφεληθείτε των χαρακτηριστικών στον κώδικά σας. Αντίθετα, στο τελευταίο θα θέλατε να δημιουργήσετε ένα σύνολο κανόνων και στη συνέχεια να καθορίσετε τους κανόνες που ισχύουν και τους κανόνες που δεν ισχύουν. Σε αυτό το παράδειγμα θα διερευνήσουμε την πρώτη προσέγγιση.

Το MEF σας παρέχει δυνατότητα επέκτασης μέσω ενός πλαισίου προσθήκης. Ο χώρος ονομάτων System.Composition παρέχει υποστήριξη για MEF στο .Net. Για να ξεκινήσετε να χρησιμοποιείτε το MEF στην εφαρμογή σας, θα πρέπει να συμπεριλάβετε το συγκρότημα System.Composition ως αναφορά στο έργο σας.

Τώρα, εξετάστε την ακόλουθη διεπαφή που ονομάζεται ILogger που δίνεται παρακάτω.

δημόσια διεπαφή ILogger

   {

string Μήνυμα {get; σειρά; }

   }

Οι ακόλουθες κατηγορίες FileLogger και DbLogger εφαρμόζουν τη διεπαφή ILogger.

[Εξαγωγή]

δημόσια τάξη FileLogger: ILogger

   {      

δημόσια συμβολοσειρά Μήνυμα

       {

ετοιμάσου;

       }

   }

[Εξαγωγή]

δημόσια τάξη DbLogger: ILogger

   {

δημόσια συμβολοσειρά Μήνυμα

       {

παίρνω; σειρά;

       }

   }

Με την πρώτη ματιά μπορεί να υποθέσετε ότι το MEF είναι σαν ένα δοχείο DI. Ωστόσο, αν και το MEF μοιάζει με κοντέινερ DI, στοχεύει κυρίως στην επεκτασιμότητα. Στην ουσία, το MEF εκμεταλλεύεται έναν μηχανισμό ανακάλυψης βάσει χαρακτηριστικών για την προώθηση της επεκτασιμότητας χωρίς την ανάγκη διαμόρφωσης των στοιχείων. Δεν χρειάζεστε εγγραφή - απλώς πρέπει να επισημάνετε τους τύπους σας με το χαρακτηριστικό Εξαγωγή και κάνει τα πάντα για εσάς. Σε αντίθεση με το Unity, όταν χρησιμοποιείτε MEF, μπορείτε απλά να επισημάνετε τις τάξεις σας χρησιμοποιώντας χαρακτηριστικά χωρίς να χρειάζεται να τα καταχωρίσετε ξεχωριστά. Όλες οι εξαγόμενες τιμές αποθηκεύονται σε ένα κοντέινερ. Η ακόλουθη κλάση δείχνει πώς μπορείτε να δημιουργήσετε ένα προσαρμοσμένο κοντέινερ MEF και να αποθηκεύσετε σε αυτό όλες τις εξαγωγές από τον κατάλογο όπου βρίσκεται η τρέχουσα συναρμολόγηση εκτέλεσης.

δημόσια στατική τάξη MEFContainer

   {

ιδιωτική στατική σύνθεσηContainer σύνθεσηContainer = null;

δημόσιο στατικό εμπορευματοκιβώτιο CompositionContainer

       {

παίρνω

           {

εάν (σύνθεσηContainer == null)

               {

var directoryCatalog =

νέος κατάλογος καταλόγου (

Path.GetDirectoryName (

Assembly.GetExecutingAss Assembly (). Τοποθεσία));

σύνθεσηContainer = νέο CompositionContainer (κατάλογος καταλόγου);

               }

επιστροφή σύνθεσηContainer;

           }

       }

   }

Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να ανακτήσετε μια παρουσία τύπου FileLogger μέσω του κοντέινερ.

FileLogger fileLogger = MEFContainer.Container.GetExportedValue ();

Ομοίως, για να ανακτήσετε μια παρουσία τύπου DbLogger, μπορείτε να χρησιμοποιήσετε το ακόλουθο απόσπασμα κώδικα.

DbLogger dbLogger = MEFContainer.Container.GetExportedValue ();

$config[zx-auto] not found$config[zx-overlay] not found