ভবিষ্যতে আপনার প্রসারিত করার প্রয়োজন হতে পারে এমন একটি আমদানিকৃত ইউটিলিটির জন্য উপযুক্ত প্যাটার্নটি হ'ল এমইএফ ব্যবহার করা - আপনি অলস তালিকা থেকে ফ্লাইতে আপনার প্রয়োজনীয় রূপান্তরকারী লোড করে মেমরির ব্যবহার কম রাখতে পারেন, গুণাবলীর সাথে সজ্জিত এমইএফ আমদানি তৈরি করতে পারেন আপনি যে আমদানিটি সম্পাদনের চেষ্টা করছেন তার জন্য সঠিক রূপান্তরকারী নির্বাচন করতে সহায়তা করে এবং বিভিন্ন আমদানি শ্রেণীর বাইরে আলাদা করার সহজ উপায় সরবরাহ করে।
প্রতিটি এমইএফ অংশ এমন কিছু স্ট্যান্ডার্ড পদ্ধতি যা আমদানি ফাইলের একটি সারিটিকে আপনার আউটপুট ডেটাতে রূপান্তর করে বা বুনিয়াদি কার্যকারিতা সহ একটি বেস শ্রেণিকে ওভাররাইড করে একটি আমদানি ইন্টারফেসকে সন্তুষ্ট করতে নির্মিত হতে পারে।
এমইএফ হ'ল একটি প্লাগ-ইন আর্কিটেকচার তৈরির জন্য একটি কাঠামো - এর দৃষ্টিভঙ্গি এবং ভিজ্যুয়াল স্টুডিও কীভাবে নির্মিত হয়, ভিএস-এ এই সমস্ত সুন্দর এক্সটেনশনগুলি এমইএফ অংশ parts
একটি এমইএফ (পরিচালিত এক্সটেনসিবিলিটি ফ্রেমওয়ার্ক) অ্যাপ্লিকেশন তৈরি করতে একটি রেফারেন্স সহ অন্তর্ভুক্ত করুন 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...
}
এটি এমন একটি শ্রেণীর সংজ্ঞা দেবে যা সিএসভি ফাইলগুলি আমদানি করবে (একটি নির্দিষ্ট বিন্যাসের: ফর্ম্যাট 1) এবং একটি কাস্টম বৈশিষ্ট্য রয়েছে যা এমইএফ রফতানি অ্যাট্রিবিউট মেটাডেটা সেট করে। আপনি আমদানি করতে চান এমন প্রতিটি ফর্ম্যাট বা ফাইল টাইপের জন্য আপনি এটি পুনরুক্ত করতে চাই। আপনি যেমন শ্রেণীর সাথে কাস্টম বৈশিষ্ট্যগুলি সেট করতে পারেন:
[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
আমদানিকৃত এমইএফ অংশগুলির একটি অলস তালিকা
তারপরে আপনি যখন জানেন যে কোন ধরণের ফাইলটি আপনি রূপান্তর করতে চান ( 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
জন্য আমদানিকৃত শ্রেণিতে কোডটি ব্যবহার করা হবে।
অনেকগুলি কোডের মতো মনে হতে পারে এবং আপনার মাথাটি কী চলছে তা পেতে কিছুক্ষণ সময় লাগতে পারে তবে এটি নতুন রূপান্তরকারী ধরণের যুক্ত করার সময় এটি অত্যন্ত নমনীয় এবং এমনকি রানটাইম চলাকালীন আপনাকে নতুন যুক্ত করার অনুমতি দিতে পারে।