향후 확장해야 할 가져 오기 유틸리티에 적합한 패턴은 MEF를 사용하는 것입니다. 게으른 목록에서 필요한 변환기를 즉시로드하여 메모리 사용을 낮게 유지하고 속성으로 장식 된 MEF 가져 오기를 작성할 수 있습니다. 수행하려는 가져 오기에 적합한 변환기를 선택하고 다른 가져 오기 클래스를 쉽게 분리 할 수있는 방법을 제공합니다.
각 MEF 파트는 가져 오기 파일의 행을 출력 데이터로 변환하거나 기본 기능으로 기본 클래스를 대체하는 일부 표준 메소드를 사용하여 가져 오기 인터페이스를 충족하도록 빌드 할 수 있습니다.
MEF는 플러그인 아키텍처를 만들기위한 프레임 워크입니다. Outlook과 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
은 가져온 클래스에서 코드를 사용합니다.
많은 코드처럼 보일 수 있으며 머리를 돌리는 데 시간이 걸릴 수 있지만 새로운 변환기 유형을 추가 할 때 매우 유연하며 런타임 중에 새 유형을 추가 할 수도 있습니다.