Подходящим шаблоном для утилиты импорта, который может потребоваться в будущем, будет использование MEF - вы можете сохранить низкое использование памяти, загружая нужный преобразователь на лету из ленивого списка, создавая импорт MEF, который украшен атрибутами это помогает выбрать правильный конвертер для импорта, который вы пытаетесь выполнить, и обеспечивает простой способ выделения различных классов импорта.
Каждая часть MEF может быть построена для удовлетворения интерфейса импорта с помощью некоторых стандартных методов, которые преобразуют строку файла импорта в ваши выходные данные или переопределяют базовый класс базовыми функциями.
MEF - это фреймворк для создания архитектуры плагинов - его внешний вид и 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. Вы бы повторили это для каждого формата или типа файла, который вы хотите импортировать. Вы можете установить пользовательские атрибуты с помощью класса:
[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
будет использоваться код в импортированном классе.
Может показаться, что кода много, и может потребоваться некоторое время, чтобы разобраться в происходящем, но он чрезвычайно гибок, когда дело доходит до добавления новых типов конвертеров, и может даже позволить вам добавлять новые во время выполнения.