Ein geeignetes Muster für ein Importdienstprogramm, das Sie möglicherweise in Zukunft erweitern müssen, wäre die Verwendung von MEF - Sie können den Speicherverbrauch niedrig halten, indem Sie den Konverter, den Sie im Handumdrehen benötigen, aus einer Lazy List laden und MEF-Importe erstellen, die mit Attributen dekoriert sind Dies hilft bei der Auswahl des richtigen Konverters für den Import, den Sie ausführen möchten, und bietet eine einfache Möglichkeit, die verschiedenen importierenden Klassen voneinander zu trennen.
Jeder MEF-Teil kann so erstellt werden, dass er eine Importschnittstelle mit einigen Standardmethoden erfüllt, die eine Zeile der Importdatei in Ihre Ausgabedaten konvertieren oder eine Basisklasse mit der Basisfunktionalität überschreiben.
MEF ist ein Framework für die Erstellung einer Plug-In-Architektur. So werden Outlook und Visual Studio erstellt. Alle diese reizvollen Erweiterungen in VS sind MEF-Teile.
Um eine MEF-App (Managed Extensability Framework) zu erstellen, müssen Sie zunächst einen Verweis auf einfügen System.ComponentModel.Composition
Definieren Sie Schnittstellen, um festzulegen, was der Konverter tun soll
public interface IImportConverter
{
int UserId { set; }
bool Validate(byte[] fileData, string fileName, ImportType importType);
ImportResult ImportData(byte[] fileData, string fileName, ImportType importType);
}
Dies kann für alle zu importierenden Dateitypen verwendet werden.
Hinzufügen von Attributen zu einer neuen Klasse, die definieren, was die Klasse "exportieren" soll
[Export(typeof(IImportConverter))]
[MyImport(ImportType.Address, ImportFileType.CSV, "4eca4a5f-74e0")]
public class ImportCSVFormat1 : ImportCSV, IImportConverter
{
...interface methods...
}
Dies würde eine Klasse definieren, die CSV-Dateien (eines bestimmten Formats: Format1) importiert und über benutzerdefinierte Attribute verfügt, mit denen die Metadaten der MEF-Exportattribute festgelegt werden. Sie wiederholen dies für jedes Format oder jeden Dateityp, den Sie importieren möchten. Sie können benutzerdefinierte Attribute mit einer Klasse wie der folgenden festlegen:
[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; }
}
Um die MEF-Konverter tatsächlich zu verwenden, müssen Sie die MEF-Teile importieren, die Sie beim Ausführen Ihres Konvertierungscodes erstellen:
[ImportMany(AllowRecomposition = true)]
protected internal Lazy<IImportConverter, IImportMetadata>[] converters { get; set; }
AggregateCatalog catalog = new AggregateCatalog();
catalog
sammelt die Teile aus einem Ordner, Standard ist der App-Speicherort.
converters
ist eine Lazy-Liste der importierten MEF-Teile
Wenn Sie dann wissen, welche Art von Datei Sie konvertieren möchten ( importFileType
und importType
), erhalten Sie einen Konverter aus der Liste der importierten Teile inconverters
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);
....
}
Der Aufruf von converter.ImportData
verwendet den Code in der importierten Klasse.
Es mag wie eine Menge Code erscheinen und es kann eine Weile dauern, bis Sie wissen, was los ist, aber es ist äußerst flexibel, wenn Sie neue Konvertertypen hinzufügen, und Sie können sogar zur Laufzeit neue hinzufügen.