Odpowiednim wzorcem dla narzędzia importującego, które może być konieczne w przyszłości, byłoby użycie MEF - możesz utrzymać niskie zużycie pamięci, ładując potrzebny konwerter w locie z leniwej listy, twórz import MEF, który jest ozdobiony atrybutami które pomagają wybrać odpowiedni konwerter dla importu, który próbujesz wykonać, i zapewniają łatwy sposób oddzielenia różnych klas importowania.
Każda część MEF może zostać zbudowana w celu spełnienia interfejsu importu za pomocą standardowych metod, które konwertują wiersz pliku importu na dane wyjściowe lub zastępują klasę podstawową za pomocą podstawowej funkcjonalności.
MEF to framework do tworzenia architektury wtyczek - jego wygląd i Visual Studio, wszystkie te piękne rozszerzenia VS są częściami MEF.
Aby zbudować aplikację MEF (Managed Extensability Framework), zacznij od dołączenia odwołania do System.ComponentModel.Composition
Zdefiniuj interfejsy, aby określić, co zrobi konwerter
public interface IImportConverter
{
int UserId { set; }
bool Validate(byte[] fileData, string fileName, ImportType importType);
ImportResult ImportData(byte[] fileData, string fileName, ImportType importType);
}
Można tego użyć dla wszystkich typów plików, które chcesz zaimportować.
Dodaj atrybuty do nowej klasy, które określają, co klasa będzie „eksportować”
[Export(typeof(IImportConverter))]
[MyImport(ImportType.Address, ImportFileType.CSV, "4eca4a5f-74e0")]
public class ImportCSVFormat1 : ImportCSV, IImportConverter
{
...interface methods...
}
Określiłoby to klasę, która będzie importować pliki CSV (określonego formatu: Format1) i ma niestandardowe atrybuty, które ustawiają metadane atrybutów eksportu MEF. Powtórz to dla każdego formatu lub typu pliku, który chcesz zaimportować. Możesz ustawić niestandardowe atrybuty za pomocą klasy takiej jak:
[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; }
}
Aby faktycznie korzystać z konwerterów MEF, musisz zaimportować części MEF utworzone podczas uruchamiania kodu konwersji:
[ImportMany(AllowRecomposition = true)]
protected internal Lazy<IImportConverter, IImportMetadata>[] converters { get; set; }
AggregateCatalog catalog = new AggregateCatalog();
catalog zbiera części z folderu, domyślnie jest to lokalizacja aplikacji.
converters to leniwa lista importowanych części MEF
Następnie, gdy wiesz, jakiego rodzaju plik chcesz przekonwertować ( importFileTypei importType) pobierz konwerter z listy importowanych częściconverters
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);
....
}
Wywołanie do converter.ImportDataużyje kodu w zaimportowanej klasie.
Może to wydawać się dużym kodem i może zająć trochę czasu, ale wszystko jest bardzo elastyczne, jeśli chodzi o dodawanie nowych typów konwerterów, a nawet pozwala ci dodawać nowe podczas działania.