2014-05-13 5 views
6

कहना मैं एक अंतरफलक IFileLoader और विशेषता FileTypeAttributeMEF लोड प्रकार है कि इंटरफेस और मैच को लागू जिम्मेदार बताते हैं

है और मैं साथ JPEGLoader में IFileLoader को लागू करने देता है [फ़ाइल-प्रकार ("। Jpg")]

मैं उपयोग कर सकते हैं MEF वर्ग (JPEGLoader) कि IFileLoader लागू करता है और फ़ाइल एक्सटेंशन के रूप में .jpg तो मैं निम्न विधि लागू कर सकते हैं मेल खाता है लोड करने के लिए:

public void IFileLoader GetLoader(string filename); 

इस MEF के साथ किया जा सकता है, या मैं इस पर कायम करना चाहिए:

var allTypes = assemblies.SelectMany(a => a.GetTypes()); 
var classes = allTypes.Where(t => t.IsClass && ! t.IsAbstract); 
var fileLoaders = classes.where(t => typeof(IFileLoader).IsAssignableFrom(t)); 
var forType = fileLoaders.Where(t => t.GetAtributeValue<FileTypeAttribute,string>(t => t.FileType, string.Empty) == fileType); 
var loaderInstances = fileLoaders.Select(t => Activator.CreateInstance(t) as IFileLoader); 

या ऊपर से कम से कम ILookup में बदल गया है, या शायद कुछ और जिसे मैंने नहीं माना है?

मैं परियोजना के विभिन्न असेंबली में या यहां तक ​​कि प्लगइन असेंबली में IFileLoader को लागू करने में सक्षम होना चाहता हूं।

उत्तर

2

MEF का उपयोग कर फ़ाइल लोडर को प्राप्त करना संभव है और निर्यात किए गए हिस्सों में Metadata संलग्न करें।

मेटाडेटा इंटरफ़ेस और विशेषता बनाएं।

public interface IFileTypeMetadata 
{ 
    string FileExtension { get; } 
} 

इंटरफ़ेस में आपको जितनी आवश्यकता हो उतनी संपत्तियां हो सकती हैं। इस विशेष समस्या के लिए, इसमें केवल एक संपत्ति FileExtension है। यह महत्वपूर्ण है कि संपत्ति में केवल getter है। MEF को रनटाइम पर मेटाडेटा बदलने की अनुमति न देने के लिए डिज़ाइन किया गया है। तो विशेषता है कि मेटाडाटा रखती बनाएँ:

public class FileTypeAttribute : Attribute, IFileTypeMetadata  
{   
    public string FileExtension { get; set; } 
} 

FileTypeAttribute वर्ग IFileTypeMetadata इंटरफ़ेस लागू करता है, और आप FileExtension संपत्ति के लिए एक setter जोड़ सकते हैं। यह FileLoader वर्गों को लागू करने के लिए आवश्यक है, और क्योंकि हम IFileTypeMetadata इंटरफ़ेस जो गुण होते हैं कि केवल getters

इंटरफ़ेस है कि फाइल लोडर वर्गों को लागू करने और फ़ाइल लोडर कक्षाएं बनाएं शामिल के माध्यम से मेटाडाटा का उपयोग करेंगे MEF शिकायत नहीं होंगे।

public interface IFileLoader 
{ 
    string LoadFile(); 
} 

इंटरफ़ेस सरलता के लिए केवल एक ही विधि में शामिल है।

[Export(typeof(IFileLoader))] 
[FileType(FileExtension = ".jpg")] 
public class JpgFileLoader : IFileLoader 
{ 
    public string LoadFile() 
    { 
     return "JPG"; 
    } 
} 

[Export(typeof(IFileLoader))] 
[FileType(FileExtension = ".png")] 
public class PngFileLoader : IFileLoader 
{ 
    public string LoadFile() 
    { 
     return "PNG"; 
    } 
} 

दोनों वर्गों IFileLoader इंटरफ़ेस को लागू और IFileLoader हिस्से के रूप में निर्यात किया जाता है, लेकिन वे अलग मेटाडाटा है, FileType विशेषता के माध्यम से: और यहाँ दो अलग डमी फ़ाइल लोडर वर्गों के उदाहरण है।

रचना कंटेनर

var catalog = new DirectoryCatalog("path to directory where dll's are located"); 
var compositionContainer = new CompositionContainer(catalog); 
compositionContainer.ComposeParts(); 

पहुँच निर्यात भागों बनाएं

var fileLoaders = compositionContainer.GetExports<IFileLoader, IFileTypeMetadata>(); 

var jpgFileLoader = fileLoaders.FirstOrDefault(x => x.Metadata.FileExtension == ".jpg"); 

if (jpgFileLoader != null) 
    Console.WriteLine(jpgFileLoader.Value.LoadFile()); //should print "JPG" 

var pngFileLoader = fileLoaders.FirstOrDefault(x => x.Metadata.FileExtension == ".png"); 

if (pngFileLoader != null) 
    Console.WriteLine(pngFileLoader.Value.LoadFile()); //should print "PNG" 
संबंधित मुद्दे