Pola yang sesuai untuk utilitas impor yang mungkin perlu Anda perluas di masa depan adalah dengan menggunakan MEF - Anda dapat menjaga agar penggunaan memori tetap rendah dengan memuat konverter yang Anda perlukan dengan cepat dari daftar malas, buat impor MEF yang dihiasi dengan atribut. yang membantu memilih konverter yang tepat untuk impor yang Anda coba lakukan dan menyediakan cara mudah untuk memisahkan kelas impor yang berbeda.
Setiap bagian MEF dapat dibangun untuk memenuhi antarmuka pengimporan dengan beberapa metode standar yang mengubah satu baris file impor ke data output Anda atau mengganti kelas dasar dengan fungsionalitas dasar.
MEF adalah kerangka kerja untuk membuat arsitektur plug-in - bagaimana pandangan dan Visual Studio dibangun, semua ekstensi yang indah di VS adalah bagian-bagian MEF.
Untuk membangun aplikasi MEF (Managed Extensability Framework), mulailah dengan menyertakan referensi System.ComponentModel.Composition
Tentukan antarmuka untuk menentukan apa yang akan dilakukan konverter
public interface IImportConverter
{
int UserId { set; }
bool Validate(byte[] fileData, string fileName, ImportType importType);
ImportResult ImportData(byte[] fileData, string fileName, ImportType importType);
}
Ini dapat digunakan untuk semua jenis file yang ingin Anda impor.
Tambahkan atribut ke kelas baru yang menentukan kelas apa yang akan "Ekspor"
[Export(typeof(IImportConverter))]
[MyImport(ImportType.Address, ImportFileType.CSV, "4eca4a5f-74e0")]
public class ImportCSVFormat1 : ImportCSV, IImportConverter
{
...interface methods...
}
Ini akan menentukan kelas yang akan mengimpor file CSV (dari format tertentu: Format1) dan memiliki atribut khusus yang menetapkan MEF Export Attribute Metadata. Anda akan mengulangi ini untuk setiap format atau jenis file yang ingin Anda impor. Anda dapat mengatur atribut khusus dengan kelas seperti:
[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; }
}
Untuk benar-benar menggunakan pengonversi MEF Anda perlu mengimpor bagian MEF yang Anda buat ketika kode konversi dijalankan:
[ImportMany(AllowRecomposition = true)]
protected internal Lazy<IImportConverter, IImportMetadata>[] converters { get; set; }
AggregateCatalog catalog = new AggregateCatalog();
catalog
mengumpulkan bagian-bagian dari folder, defaultnya adalah lokasi aplikasi.
converters
adalah daftar malas bagian-bagian MEF yang diimpor
Kemudian ketika Anda tahu jenis file yang ingin Anda konversi ( importFileType
dan importType
) dapatkan konverter dari daftar bagian yang diimporconverters
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);
....
}
Panggilan ke converter.ImportData
akan menggunakan kode di kelas yang diimpor.
Mungkin tampak seperti banyak kode dan butuh beberapa saat untuk memahami apa yang terjadi tetapi sangat fleksibel ketika harus menambahkan jenis konverter baru dan bahkan dapat memungkinkan Anda untuk menambahkan yang baru saat runtime.