รูปแบบที่เหมาะสมสำหรับยูทิลิตี้การนำเข้าที่คุณอาจต้องการขยายในอนาคตคือใช้ MEF - คุณสามารถใช้หน่วยความจำต่ำโดยโหลดตัวแปลงที่คุณต้องการได้ทันทีจากรายการที่ขี้เกียจสร้าง MEF ที่นำเข้าที่ตกแต่งด้วยคุณสมบัติ ที่ช่วยเลือกตัวแปลงที่ถูกต้องสำหรับการนำเข้าที่คุณกำลังพยายามดำเนินการและให้วิธีการแยกคลาสการนำเข้าที่แตกต่างออกไปได้อย่างง่ายดาย
MEF แต่ละส่วนสามารถสร้างขึ้นเพื่อสนองต่อการนำเข้าอินเทอร์เฟซด้วยวิธีมาตรฐานบางอย่างที่แปลงแถวของไฟล์นำเข้าเป็นข้อมูลเอาต์พุตของคุณหรือแทนที่คลาสพื้นฐานด้วยฟังก์ชันการทำงานพื้นฐาน
MEF เป็นเฟรมเวิร์กสำหรับการสร้างสถาปัตยกรรมปลั๊กอิน - วิธีสร้าง outlook และ Visual Studio, ส่วนขยายที่น่ารักเหล่านั้นทั้งหมดใน VS เป็นส่วน MEF
ในการสร้างแอป MEF (Managed Extensability Framework) ให้เริ่มด้วยการรวมการอ้างอิง 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 Export Attribute Metadata คุณจะทำสิ่งนี้ซ้ำสำหรับแต่ละรูปแบบหรือประเภทไฟล์ที่คุณต้องการนำเข้า คุณสามารถตั้งค่าแอตทริบิวต์ที่กำหนดเองด้วยคลาสเช่น:
[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
ใช้จะใช้รหัสในคลาสที่นำเข้า
อาจดูเหมือนโค้ดจำนวนมากและอาจต้องใช้เวลาสักครู่เพื่อให้หัวของคุณเกิดอะไรขึ้น แต่มันมีความยืดหยุ่นอย่างยิ่งเมื่อมันมาถึงการเพิ่มตัวแปลงชนิดใหม่