İleride genişletmeniz gerekebilecek bir içe aktarma yardımcı programı için uygun bir desen MEF kullanmak olacaktır - tembel bir listeden anında ihtiyacınız olan dönüştürücüyü yükleyerek bellek kullanımını düşük tutabilir, özelliklerle süslenmiş MEF ithalatları oluşturabilirsiniz gerçekleştirmeye çalıştığınız içe aktarma için doğru dönüştürücüyü seçmenize yardımcı olur ve farklı içe aktarma sınıflarını ayırmanın kolay bir yolunu sunar.
Her MEF parçası, içe aktarma dosyasının bir satırını çıktı verilerinize dönüştüren veya temel işlevselliğe sahip bir temel sınıfı geçersiz kılan bazı standart yöntemlerle bir içe aktarma arabirimini karşılamak için oluşturulabilir.
MEF bir eklenti mimarisi oluşturmak için bir çerçevedir - görünüm ve Visual Studio'nun nasıl oluşturulduğu, VS'deki tüm bu güzel uzantılar MEF parçalarıdır.
Bir MEF (Yönetilebilir Genişletilebilirlik Çerçevesi) uygulaması oluşturmak için, System.ComponentModel.Composition
Dönüştürücünün ne yapacağını belirlemek için arayüzleri tanımlayın
public interface IImportConverter
{
int UserId { set; }
bool Validate(byte[] fileData, string fileName, ImportType importType);
ImportResult ImportData(byte[] fileData, string fileName, ImportType importType);
}
Bu, içe aktarmak istediğiniz tüm dosya türleri için kullanılabilir.
Yeni bir sınıfa, sınıfın neyi "Dışa aktaracağını" belirten özellikler ekleyin
[Export(typeof(IImportConverter))]
[MyImport(ImportType.Address, ImportFileType.CSV, "4eca4a5f-74e0")]
public class ImportCSVFormat1 : ImportCSV, IImportConverter
{
...interface methods...
}
Bu, CSV dosyalarını (belirli bir biçimde: Format1) içe aktaracak ve MEF Export Attribute Meta Verilerini ayarlayan özel niteliklere sahip bir sınıf tanımlar. Almak istediğiniz her biçim veya dosya türü için bunu tekrar edersiniz. Aşağıdaki gibi bir sınıfla özel öznitelikler ayarlayabilirsiniz:
[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; }
}
Aslında MEF dönüştürücülerini kullanmak için, dönüştürme kodunuz çalıştırıldığında oluşturduğunuz MEF parçalarını içe aktarmanız gerekir:
[ImportMany(AllowRecomposition = true)]
protected internal Lazy<IImportConverter, IImportMetadata>[] converters { get; set; }
AggregateCatalog catalog = new AggregateCatalog();
catalog
parçaları bir klasörden toplar, varsayılan uygulama konumudur.
converters
içe aktarılan MEF parçalarının tembel bir listesidir
Ardından, ne tür bir dosyayı dönüştürmek istediğinizi bildiğinizde ( importFileType
ve importType
) içe aktarılan parçalar listesinden bir dönüştürücü alınconverters
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);
....
}
To call converter.ImportData
, içe aktarılan sınıftaki kodu kullanır.
Çok fazla kod gibi görünebilir ve başınızın ne olup bittiğini görmek biraz zaman alabilir, ancak yeni dönüştürücü türleri eklemek söz konusu olduğunda son derece esnektir ve hatta çalışma zamanı sırasında yenilerini eklemenize izin verebilir.