Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

添加了Magicodes.IE.Stash模块,仅演示思路 #498

Merged
merged 7 commits into from
Apr 9, 2023

Conversation

wlclass
Copy link
Contributor

@wlclass wlclass commented Mar 31, 2023

关于数据导入之我见:

系统中导入的数据源大多来自上传的excel文件,常规导入功能流程是:

1.定义一个专用于导入的映射dto模型,在模型上通过注解来配置导入约束和转换.
2.用户上传数据文件后,使用IE的导入功能,将excel文件数据输出为Dto实例集合.
3.后续逻辑,再将dto实例集合,转换为其它dao类型的对象,进行后一步操作.

由上可见,dto的作用,仅用于约束本场景的excel数据源.并且前提是与用户约定好数据源的字段名称.偶合较重.
如果数据源的格式由于某些原因发生变更(如:列名修改,增减列,列数据拆分等),
那么,后端必须相应的修改dto,甚至还要修改dto之后与dao的转换逻辑,然后编译发布上线.

综上,现提出一个新的导入思路:

为每种数据源,提供一个可配置的映射机制,使用一个引擎,读取数据源,并根据映射规则,直接将数据转换为dao,舍弃提前定义dto的步骤.
规则引擎支持C#语法,并可调用项目中已定义的库和方法. 为导入提供更多的灵活性,

@xl-wenqiang
Copy link
Collaborator

老吴,刚整体初步过了一下,感觉这个思路很不错,考虑的也非常周全。个人有几个建议探讨一下:

  1. 如果是Excel定义,是否可以跟导入数据的Excel放一起,以隐藏或者显式的Sheet进行定义,约定名称为“$definition$"
  2. 不建议根据Dto去映射数据(虽然性能会更好,但是不够灵活),是否可以先将Excel里的数据先读出来,放在一个动态对象(比如List<Dictionary<string,object>>)里面,然后再去映射实体。 如果没有配置DtoTypeName,则直接返回动态对象,用户可以直接使用,也可以根据字段自行映射。
  3. 后续可以支持数据验证(验证器)
  4. 其他细节:建议模板定义的关键字使用英文

@xl-wenqiang
Copy link
Collaborator

另外,导入可以不限于Excel了,这已经是规则引擎了

@xl-wenqiang
Copy link
Collaborator

名字建议再斟酌一下。

@wlclass
Copy link
Contributor Author

wlclass commented Mar 31, 2023

老吴,刚整体初步过了一下,感觉这个思路很不错,考虑的也非常周全。个人有几个建议探讨一下:

  1. 如果是Excel定义,是否可以跟导入数据的Excel放一起,以隐藏或者显式的Sheet进行定义,约定名称为“$definition$"

可以,也有必要,这样一来数据源和规则可以做为单为文件分发,应该实现这个想法.
另外,让我们试想一下,用户的数据源,是从其它系统导出的,并且用户也不是编辑映射规则的人(用户不一定搞得定).那么,他每次导入数据之前,是不是都需要把映射规则,从其它地方手动添加到数据源中呢,如果数据源导入频率很高,是不是会产生很多不必要的工作呢?
所以我建议:同时支持数据源内置规则定义sheet,和使用外部规则两种方法.

  1. 不建议根据Dto去映射数据(虽然性能会更好,但是不够灵活),是否可以先将Excel里的数据先读出来,放在一个动态对象(比如List<Dictionary<string,object>>)里面,然后再去映射实体。 如果没有配置DtoTypeName,则直接返回动态对象,用户可以直接使用,也可以根据字段自行映射。

是的,目前的实现是,循环读取所有行的所有列,并执行动态转换器脚本,每一行数据以列为单位,放到一个 List中,ColValue对象是用来放单元格(话说应该改名为CellValue更合适)执行后的相关数据,ColValue记录这些内容(列的索引位置、列标题、cell的Text、cell的object类型的原始值还有列的ExcelRange)。
目前确实是每一行如上读取完后,直接实例化dto并赋值,可以改造为,所有行都读完并缓存后,再根据是否需要转换为dto.做后续处理。这样就可以灵活定义是否要输出dto集合。

  1. 后续可以支持数据验证(验证器)

ok.应该的功能,具体再讨论。

  1. 其他细节:建议模板定义的关键字使用英文

没问题,甚至应该让用户做全局配置,库只提供一个默认选项。

@wlclass wlclass changed the title 添加了JustCode模块,仅演示思路 添加了Magicodes.IE.Stash模块,仅演示思路 Apr 2, 2023
@xl-wenqiang
Copy link
Collaborator

建议在readme.md里面把文档补充一下,包含梳理后的思路、TODOLIST等。

@xl-wenqiang xl-wenqiang self-assigned this Apr 9, 2023
@xl-wenqiang xl-wenqiang merged commit 44382ba into dotnetcore:master Apr 9, 2023
@HongFei-Ye
Copy link

你们的QQ群满了,进来不了,请问一下Magicodes.IE.Stash模块现在可以使用吗?有没有Demo?

@wlclass
Copy link
Contributor Author

wlclass commented Apr 27, 2023

你们的QQ群满了,进来不了,请问一下Magicodes.IE.Stash模块现在可以使用吗?有没有Demo?

可以参考单元测试

@xingyunxing
Copy link

@wlclass 1、如果是Excel定义,是否可以跟导入数据的Excel放一起,以隐藏或者显式的Sheet进行定义,约定名称为“$definition$"
这个部分很不安全,由于可以执行代码,放到用户那边就放大了权限,应该去除

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants