下面的例子假设要导入的对象是Vendor
1 根据导入文件的格式,创建对应的VendorImportItem,此类应该继承自ImportLibrary.BaseImportItem
2 创建VendorFileParser,此类需要实现ImportLibrary.IFileParser接口。在实现Parse方法的过程中,读取导入文件的内容,生成IEnumerable<VendorImportItem>的集合。注意:Parser不要加入业务逻辑过程,只把文件中的有用的原始数据导入
3 创建一系列VendorXXXValidateHandler, 这些Handler需要继承自ImportLibrary.Validate.ValidateHandler<VendorImportItem>
3.1 每一个VendorXXXValidateHandler的类定义的前面需要加一个属性Order如下
[Order(1)] public class VendorCodeValidateHandler : ValidateHandler<VendorImportItem> { protected override void Validate(IEnumerable<VendorImportItem> item) { --这里是验证逻辑 IEnumerable<VendorImportItem> emptyItems = item.Where (x=>string.IsNullOrEmpty(x.Code)) ; this.AppendErrorMessage(emptyItems, "编号不能为空"); } }
Order属性的参数是验证的顺序,框架会搜索所有的ValidateHandler<VendorImportItem>的实现类,并按Order后面的参数排序后逐个调用。如果省略此属性,则缺省值为100
可以调用基类的AppendErrorMessage和AppendWarningMessage方法添加验证的错误信息。
4创建VendorImporter,此类继承自ImportLibrary.BaseImporter<VendorImportItem>
实现DoImport方法的步骤
4.1此时VendorImportItem集合中,每一项的Result有Succeed, Failed, Warning三种,可以根据需要决定是否导入Warning的记录。
4.2 调用相应的业务逻辑把符合条件的项导入到业务表中。
注:BaseImporter有另外一种重载的格式BaseImporter<T,ResultT>, 详见文末关于自定义结果格式的说明
5 Controller层
5.1 通过IImportFactory创建对应的Importer
IFileParser parser = new VendorFileParser(Server.MapPath("~/Temp/" + fileName)); IImport importer = ImportFactory.CreateImport("Vendor"); importer.FileParser = parser;
5.2 调用Import方法
return RcJson(JsonConvert.DeserializeObject<FeedbackResult<VendorImportItem>>(importer.Import()));
5.3 在MyValueSelector.cs中配置Importer。Dictionary中每一项是对应的实现类。
Dictionary<string, string> importerType = new Dictionary<string, string> { {"QR","ESC.QRImpl.Import.QRImporter,ESC.QRImpl"}, {"Vendor","ESC.VendorImpl.Import.VendorImporter,ESC.VendorImpl" } };
6 客户端呈现导入结果
返回客户端的对象结构如下
{
FailedCount: 失败的数量,
SucceedCount: 成功的数量,
WarningCount: 警告的数量,
Items: 导入文件中的Item的集合,包含一个ErrorMessage属性,如果是Failed或者Warning此属性不为空
ErrorMessage: 如果上传的文件格式错误或者导入过程中出现意外错误,此属性包含对应的错误信息。
}
7 自定义结果格式
可自定义一个VendorImportResult, 这个类需要继承自ImportLibrary.BaseImportResult<VendorImportItem>,然后重载GetSucceedMessage方法。
同时VendorImporter需要继承自BaseImporter<VendorImportItem,VendorImportResult>.