There is a scenario like this:
Now an interface has a number of implementation classes that need to be configured to determine which specific implementation class to invoke. This makes software extensibility much more
This effect can be achieved by ExportMetaData in MEF.
1. Now we build an interface:
namespace consoleapplication1.interface{ publicInterface imiservice { void SignIn (); }}
2. Create a new meta class
namespace consoleapplication1.metadata{ publicinterface placemetadata { string Get ; } }}
3. There are two implementation classes
namespaceconsoleapplication1.impl{//[Export ("Hangzhou", typeof (Imiservice))][Export (typeof(Imiservice))] [ExportMetaData (" Place","Hangzhou")] Public classHzmiservice:imiservice { Public voidSignIn () {Console.WriteLine ("HZ SignIn"); } }}
namespaceconsoleapplication1.impl{//[Export ("Shanghai", typeof (Imiservice))][Export (typeof(Imiservice))] [ExportMetaData (" Place","Shanghai")] Public classShmiservice:imiservice { Public voidSignIn () {Console.WriteLine ("SH MI"); } }}
4. Invoking different implementation classes in the program according to different configurations
namespaceconsoleapplication1{classProgram {//Const String place = "Hangzhou"; //[Import (place)]//Public imiservice Miservice {set; get;}[ImportMany] IEnumerable<lazy<imiservice, placemetadata>> dolist {Set;Get; } PublicImiservice Miservice {Set;Get; } Static voidMain (string[] args) { Program Program=NewProgram (); Program.compose (); varService = program. Dolist.where (x = X.metadata.place = ="Hangzhou"). FirstOrDefault (); Program. Miservice=service. Value; Program. Miservice.signin (); } voidCompose () {varCatalog =NewAssemblycatalog (assembly.getexecutingassembly ()); Compositioncontainer Container=Newcompositioncontainer (catalog); Container.composeparts ( This); } }}
MEF injects service based on configuration