आयात उपयोगिता के लिए एक उपयुक्त पैटर्न जिसे आपको भविष्य में विस्तारित करने की आवश्यकता हो सकती है MEF का उपयोग करने के लिए - आप एक आलसी सूची से मक्खी पर अपनी ज़रूरत के कनवर्टर को लोड करके मेमोरी का उपयोग कम रख सकते हैं, MEF आयात बनाएँ जो विशेषताओं से सजाए गए हैं उस आयात के लिए सही कनवर्टर का चयन करने में मदद करें जिसे आप प्रदर्शन करने की कोशिश कर रहे हैं और विभिन्न आयात वर्गों को अलग करने का एक आसान तरीका प्रदान करता है।
प्रत्येक MEF भाग को कुछ मानक विधियों के साथ एक आयात इंटरफ़ेस को संतुष्ट करने के लिए बनाया जा सकता है, जो आयात फ़ाइल की एक पंक्ति को आपके आउटपुट डेटा में परिवर्तित करते हैं या मूल कार्यक्षमता के साथ बेस क्लास को ओवरराइड करते हैं।
MEF एक प्लग-इन आर्किटेक्चर बनाने का एक ढांचा है - इसका आउटलुक और विज़ुअल स्टूडियो कैसे बनाया जाता है, वीएस में उन सभी प्यारे एक्सटेंशन MEF भाग हैं।
MEF (प्रबंधित एक्स्टेंसिबिलिटी फ्रेमवर्क) ऐप बनाने के लिए एक संदर्भ के साथ शुरू होता है System.ComponentModel.Composition
यह निर्धारित करने के लिए इंटरफेस को परिभाषित करें कि कनवर्टर क्या करेगा
public interface IImportConverter
{
int UserId { set; }
bool Validate(byte[] fileData, string fileName, ImportType importType);
ImportResult ImportData(byte[] fileData, string fileName, ImportType importType);
}
यह उन सभी फ़ाइल प्रकारों के लिए उपयोग किया जा सकता है जिन्हें आप आयात करना चाहते हैं।
एक नए वर्ग में विशेषताएँ जोड़ें जो परिभाषित करता है कि वर्ग "निर्यात" क्या करेगा
[Export(typeof(IImportConverter))]
[MyImport(ImportType.Address, ImportFileType.CSV, "4eca4a5f-74e0")]
public class ImportCSVFormat1 : ImportCSV, IImportConverter
{
...interface methods...
}
यह एक वर्ग को परिभाषित करेगा जो CSV फ़ाइलों को आयात करेगा (एक विशेष प्रारूप का: Format1) और इसमें एक कस्टम विशेषताएँ हैं जो MEF निर्यात विशेषता मेटाडेटा सेट करती हैं। आप इसे प्रत्येक प्रारूप या फ़ाइल प्रकार के लिए दोहराएंगे जिसे आप आयात करना चाहते हैं। आप वर्ग के साथ कस्टम विशेषताएँ सेट कर सकते हैं जैसे:
[MetadataAttribute]
[AttributeUsage(AttributeTargets.All, AllowMultiple = false)]
public class ImportAttribute : ExportAttribute
{
public ImportAttribute(ImportType importType, ImportFileType fileType, string customerUID)
: base(typeof(IImportConverter))
{
ImportType = importType;
FileType = fileType;
CustomerUID = customerUID;
}
public ImportType ImportType { get; set; }
public ImportFileType FileType { get; set; }
public string CustomerUID { get; set; }
}
वास्तव में MEF कन्वर्टर्स का उपयोग करने के लिए आपको आपके द्वारा बनाए गए MEF भागों को आयात करने की आवश्यकता होती है जब आपका परिवर्तित कोड चलाया जाता है:
[ImportMany(AllowRecomposition = true)]
protected internal Lazy<IImportConverter, IImportMetadata>[] converters { get; set; }
AggregateCatalog catalog = new AggregateCatalog();
catalog
फ़ोल्डर से भागों को इकट्ठा करता है, डिफ़ॉल्ट ऐप लोकेशन है।
converters
आयातित MEF भागों की एक आलसी सूची है
फिर जब आप जानते हैं कि आप किस प्रकार की फ़ाइल को परिवर्तित करना चाहते हैं ( importFileType
और importType
) आयातित भागों की सूची से एक कनवर्टर प्राप्त करते हैंconverters
var tmpConverter = (from x in converters
where x.Metadata.FileType == importFileType
&& x.Metadata.ImportType == importType
&& (x.Metadata.CustomerUID == import.ImportDataCustomer.CustomerUID)
select x).OrderByDescending(x => x.Metadata.CustomerUID).FirstOrDefault();
if (tmpConverter != null)
{
var converter = (IImportConverter)tmpConverter.Value;
result = converter.ImportData(import.ImportDataFile, import.ImportDataFileName, importType);
....
}
converter.ImportData
आयात करने वाली कॉल आयातित वर्ग में कोड का उपयोग करेगी।
बहुत सारे कोड की तरह लग सकता है और आपके सिर को गोल करने में कुछ समय लग सकता है, लेकिन इसके बेहद लचीले होने पर यह नए कनवर्टर प्रकारों को जोड़ने के लिए आता है और आपको रनटाइम के दौरान नए जोड़ने की अनुमति भी दे सकता है।