下面的例子假设要导入的对象是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>.

posted on 2021-01-15 16:08  蒙蒙浮霁月  阅读(180)  评论(0编辑  收藏  举报