个性化阅读
专注于IT技术分析

MetaDapper:使用合适的工具轻松进行数据映射和转换

本文概述

数据转换, 翻译和制图绝不是火箭科学, 但绝对是乏味的。即使是简单的数据转换任务(例如, 将CSV文件读取到类实例列表中), 也可能需要大量的代码。尽管所有这些任务都有很多共同点, 但是它们”足够不同”以要求使用自己的数据转换方法。

实际上, 在我们构建的每个系统中, 我们都会发现自己需要将数据从一种形式转换为另一种形式, 无论是从现有数据存储中导入数据, 处理来自传入流的数据, 还是从一种格式转换为另一种格式以便内部使用。处理或将数据转换为所需的输出格式。

而且每次执行此操作时, 该任务看起来都与之前多次完成的任务非常令人沮丧, 但又有足够的差异, 要求我们从头开始重新进行数据映射过程。

此外, 随着最流行的格式和访问它们的技术的不断发展, 以及新格式的引入和流行, 程序员不得不不断学习新的数据转换和映射技术, 库, API和框架。随着数据科学服务的不断发展和发展, 对专用工具的需求也在不断增长。

尽管你可以利用AutoMapper(将数据从一个对象映射到另一个对象)或Resharper(重构现有代码)之类的工具, 但是无论你做什么, 代码编写起来都会很繁琐, 并且始终需要维护。然后, 你必须提出一种跨域转换处理的解决方案, 例如将内部代码和键值转换为另一层或系统的值, 将空值转换为默认值, 类型转换等。

验证具有类似的问题, 这些问题可以通过DataAnnotations和jQuery Validation插件之类的技术以及大量的自定义验证代码来解决。而且, 每种技术的细微差别都可能非常微妙。

作为一名高级数据科学家, 你会告诉自己”必须有更好的方法。”好吧, 事实上, 有。这就是本数据映射教程的内容。

介绍MetaDapper数据映射工具

MetaDapper是一种数据映射工具,可使用各种数据映射技术来帮助完善此过程。

MetaDapper是一个.NET库, 它致力于最大程度地简化和简化数据转换过程。

MetaDapper通过以下方式促进数据转换:

  • 将数据转换过程的可重复样板部分与每个数据转换任务所独有的那些方面分离。
  • 提供易于使用的直观用户界面, 用于指定任意复杂度的映射和翻译规则。

MetaDapper将逻辑映射(方案, 数据转换和验证)与物理数据映射(与各种文件格式和API相互转换)分开。逻辑映射具有一组强大的功能, 并允许你挂钩自己的方法来满足非常具体的需求。物理映射包括一组丰富的支持格式, 这些格式会不断扩展。为了配置映射, 提供了MetaDapper Configurator。一种易于使用的Windows可执行文件, 用于创建和编辑映射, 并执行它们以进行测试或一次性转换。

将类实例列表转换为XML或CSV文件, 填充SQL数据库记录, 生成用于填充表的SQL脚本, 创建电子表格等等, 所有这些操作都使用通常可以在几秒钟内创建的同一配置文件完成。

要将MetaDapper包含在.NET程序中, 你只需要:

  • 添加对库的引用
  • 实例化MetaDapper引擎
  • 执行映射, 指定源读取器(和任何参数), 目标写入器(和任何参数)以及你的配置文件。

成功后, 编写器将输出转换后的数据。发生错误时, 异常将返回详细的错误信息, 因此你可以拒绝数据或调整配置。

这是一个简短的数据映射示例:

List<MyClass> result;
try
{
	// Instantiate the MetaDapper library.
	var log = new Log();
	var cultureInfo = new CultureInfo("en-US");
	var md = new MetaDapper.Engine.MetaDapper(log, cultureInfo);

	using (var inputStream = new StreamReader(@"C:\myfile.csv"))
	{
		md.MapData(
			new CsvReaderParameters
			{
				Log = log, CultureInfo = cultureInfo, InputStream = inputStream.BaseStream, InputEncoding = Encoding.ASCII, FirstRecordIsHeader = false
			}, new PublicPropertiesWriterParameters
			{
				Log = log, CultureInfo = cultureInfo
			}, @"C:\MyMetaDapperConfiguration.xml", false, out result);
	}
}
catch (Exception)
{
	throw;
}

MetaDapper”配置器”

MetaDapper Configurator提供了一种直观地完成定义数据结构和转换/映射规则的步骤的方法。 Configurator使你可以创建, 编辑和执行配置(即用于测试或一次性转换)。

MetaDapper的Configurator致力于使尽可能多的过程自动化。例如, 在指定字段映射时, 可以使用名称匹配自动匹配源字段和目标字段。同样, 在为包含元数据的数据源创建记录定义时, 可以通过指向数据源来自动填充字段定义。

创建记录定义后, 记录定义将保持其与创建它的数据源的链接(如果有的话), 因此如果数据源模式随后发生更改, 则可以自动更新它。为几乎没有元数据或没有可用元数据的数据源配置记录定义时, 如果有另一个包含元数据的类似数据源可用, 则可以复制该记录定义(及其元数据)作为新记录定义的基础和然后可以对其进行编辑以反映两个数据源之间可能存在的任何差异。并且在多个数据源的架构和元数据相同的情况下, 单个记录定义可以全部用于它们。

简化数据转换过程

让我们更详细地了解数据转换过程中固有的一些挑战以及MetaDapper为开发人员提供便利和简化的方式。

将源映射到目标数据

在维护过程中更改内部或外部结构时, 可能还需要调整依赖于这些结构的任何映射代码。这是一个经常需要维护工作的领域, 因此, 无论使用哪种解决方案, 都需要评估维护成本。例如, 如果从Sale类中删除了TotalSale属性, 则需要相应地调整所有相关的映射分配。

使用MetaDapper, 更新映射可能只需要几秒钟。例如, 对于类类型, 只需单击”从类中导入字段定义”按钮即可将字段刷新为新编译的定义:

将源映射到目标数据

类型转换

某些类型转换(例如日期/时间和数字类型转换)对宿主环境的国际设置敏感(除非在代码中明确指定)。因此, 在具有不同国际设置的新服务器上部署应用程序可能会破坏没有考虑到这一点的代码。例如, 在具有美国设置的机器上, 日期值” 1-2-2014″将被解释为2014年1月2日, 而在具有英国设置的机器上, 日期值将被解释为2014年2月1日。 MetaDapper支持所有隐式.NET转换, 并允许复杂的值重新格式化作为转换的一部分。此外, 可以在MetaDapper读取器, 写入器和映射引擎中指定单独的(即独立的)国际设置。

复杂的默认值

有时, 需要特定的业务规则, 这些规则需要访问其他系统或需要复杂的编码才能确定默认值。 MetaDapper允许向引擎注册任意数量的自定义委托方法, 并用于提供默认值, 执行自定义数据转换和提供自定义字段验证。

条件验证规则

有条件地要求字段值(甚至其有效值取决于其他字段的值)的情况并不少见。例如, 在某些情况下, “合作伙伴名称”和”合作伙伴社会保障代码”字段可以保留为空白, 但是如果提供了”合作伙伴名称”, 则必须提供”合作伙伴社会保障代码”(可能还有其他字段)。这种类型的条件验证很复杂, 在自定义代码中很容易出错。相比之下, MetaDapper允许轻松配置这种数据映射关系。具体而言, 可以在”条件强制字段”组中列出”记录定义”中的字段列表:

这些示例数据字段之间的关系很容易使用MetaDapper等数据映射工具进行配置。

然后, 在映射中, 该组可以与任何字段关联, 如果不为null, 则该字段又需要提供该组中的所有字段。例如:

此数据映射示例显示了使用MetaDapper与自定义代码相比更容易配置。

跨域转换映射值

源数据可能包含不一致的值。例如, 称呼字段可以包含”先生”, “先生”, “先生”, “先生”或” M”以及所有女性等效项。或货币字段可能包含” $”之类的值, 而目标格式则需要” USD”。产品代码是可能需要从一个系统转换到另一个系统的值的另一个示例。 MetaDapper允许规范可重用的”同义词列表”, 该列表可用于在映射过程中转换值。

定义后, 你可以指定同义词组以在任何相关字段映射中使用它:

在Social Security示例中,此数据映射技术可以很好地处理同义词。

基于值格式和复杂计算的映射

来自一个或多个字段的值可能需要用于格式化新值。例如, 源值可能需要用常量修饰(例如, sale.PriceEach =” $” + priceEach;), 或者可能需要使用多个字段来生成值(例如, sale.Code = code1 +” _” + code2;)。

MetaDapper提供了一种格式化/模板化功能, 使你可以使用当前记录中的任何字段来构建值, 包括字段的子字符串部分或常量值。格式化后, 该值将转换为指定的目标类型(顺便说一句, 不必是字符串)。

同样, 可以在映射过程中使用完整的数学运算符和函数对字段值和常量的任意组合执行复杂的计算。

验证规则

可以注册自定义验证委托并在映射中使用。这是一个用于验证字段值是否为整数的自定义方法的示例(无需将字段的数据类型设为整数):

private static bool ValidateIsInteger(
Log log, CultureInfo cultureInfo, object value, ref List<ErrorInfo> errors)
{
    try
    {
        Convert.ToInt32(value);
    }
    catch (Exception)
    {
        return false;
    }

    return true;
}

实例化MetaDapper时将注册该方法。然后可以轻松地将其应用于任何字段映射定义:

MetaDapper定义图

分组, 排序和过滤

分组和排序操作通常可以在数据库查询中处理, 但并非所有数据源都是数据库。因此, MetaDapper支持可以在内存中执行的复杂分组和排序操作的配置。

在仅需要一部分源数据的情况下, 从非数据库源进行过滤的实现和维护可能非常复杂。 MetaDapper支持使用布尔运算符配置复杂的过滤器, 以对每个记录进行任意数量的字段评估, 并根据需要任意深度地嵌套操作。例如:

复杂的过滤器在此处显示的数据映射过程中起着重要作用。

上面的过滤器等效于以下C#代码:

if (sale.TransactionID > "0"
    AND sale.Currency == "USD"
    AND (sale.Amount > "3" || sale.Amount == "1")

嵌套映射

有些映射需要多次通过才能完成数据转换过程。一些示例包括需要前缀或求和记录的数据, 需要根据字段值或文档结构进行不同映射的数据, 或者仅仅是为了隔离复杂映射的不同阶段(即, 翻译名称, 类型转换等)而需要的数据。为此, MetaDapper支持嵌套映射到任何深度。

格式与结构

作为数据映射和转换工具, MetaDapper构建为实际上允许使用内部读取器和写入器接口读取或写入任何数据格式。这样就可以创建重量极轻且仅针对特定于格式的细微差别的读取器/写入器类。

读者和作家的行为也应尽可能聪明和灵活。例如, XML读取器和写入器使用XPath来指定在XML文件中检索或写入数据的位置。例如, 相同的配置还可用于从非XML格式(例如CSV文件)读取和写入, 在这种情况下, XPath值将被忽略。同样, 如果将不包含XPath设置的配置与XML读取器或写入器一起使用, 则会生成错误。

是的对。当然。 (一些实际数据映射示例)

你对此表示怀疑。我不怪你软件工具很少是他们声称的那样。因此, 这里有一些真实的示例, 其中已经使用MetaDapper来提供运营收益。

一家提供医疗保险管理软件的公司的客户不想填写网络表格, 但希望在电子表格中提供数据。使用MetaDapper, 上传的电子表格将被读入内存, 清理数据, 验证记录并将结果存储在其数据库中。他们可以使用MetaDapper接受客户的Excel文件, 而无需任何人工验证, 并且可以轻松为其发布的每个电子表格模板创建配置文件。

一家大型天然气公司拥有内部应用程序, 希望其管理用户能够以Excel格式下载报告。报告格式可能会定期更改。 MetaDapper有助于从数据库中生成Excel工作表。更新Excel格式仅需要更新MetaDapper配置文件, 而无需任何代码更改或重新编译。

一家提供资产管理软件的公司需要一种解决方案, 用于以客户相关的会计软件包格式生成财务数据, 以导入到那些系统中。使用ORM包装器开发了通用会计数据查询, 并使用MetaDapper将数据分类, 筛选和映射为每个客户所需的方案和格式。为每个客户进行一个或多个MetaDapper配置, 这已成为新客户的主要销售功能。可以在几分钟之内配置好该产品(使用MetaDapper), 以支持任何自定义或标准记帐软件包格式, 因此每次新销售中都包括与基本系统和现有系统的集成。同一家公司在各种软件集成项目中使用MetaDapper, 在它们的系统之间映射和转换数据以及转换内部代码。

一家大型汽车经销商需要将一些Excel格式的销售报告添加到其中一个应用程序中。这些报告在不到一个小时的时间内被添加到了应用程序中-开始完成。

开发人员需要一张美国表, 该表与另一个网站上使用的表相同。 MetaDapper用于从站点中挖掘数据, 并在几分钟内生成一个SQL脚本以填充其表。

这些只是MetaDapper久经考验的实用程序和作为数据映射工具的价值的几个示例。

本文总结

需要花很多时间才能开始更一般地考虑数据转换, 并开始考虑具有业务规则和无限用处的数据集。 MetaDapper是一个促进和促进这一观点的框架。

无论你是使用其他技术MetaDapper还是使用自己的数据映射解决方案, 这都是对数据转换项目中某些复杂性和隐藏成本的介绍。希望你能从中获得启发。

(有关MetaDapper的更多信息, 请通过[电子邮件保护]与MetaDapper团队联系。)

赞(0)
未经允许不得转载:srcmini » MetaDapper:使用合适的工具轻松进行数据映射和转换

评论 抢沙发

评论前必须登录!