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"