【问题标题】:Prevent refactoring mistakes with mapping libraries使用映射库防止重构错误
【发布时间】:2016-11-11 05:47:19
【问题描述】:

给定

class A { string Name {get;set;} }
class B { string Name {get;set;} }

然后我使用 automapper 在 A 和 B 之间进行转换。后来,我将 A.Name 重命名为 A.MyName:

class A { string MyName {get;set;} }
class B { string Name {get;set;} }

由于隐式配置,这将破坏我的映射。隐式配置隐式创建A 和B 之间的关系。重构算法无法识别这种关系从而产生中断。

什么映射器解决了这个问题?

【问题讨论】:

  • 我认为没有,您有两种截然不同的类型,您需要定义它们的映射方式。您可以期望的最好结果是强类型映射,因此当您重构代码时,会在编译时产生错误。

标签: c# automapper objectmapper object-object-mapping


【解决方案1】:

使用接口interface ABcommon { string Name {get;set;} },A 类和B 类实现它。重命名将起作用。

【讨论】:

  • 一旦类 A 被重构为使用 MyName,就没有通用接口了。
  • 接口的重点是充当类之间的适配器,将IA.Name路由到A.MyName。
  • 这不起作用,因为A类和B类的属性名称不同。因此,它们不能同时实现这两个接口。
  • @Adam Carr:如果您创建 ABcommon 接口并告诉程序 A 和 B 实现了它,那么所有更改都将在接口和实现类上进行。 VS 2013 允许您重命名实现并反映对接口和其他实施类的更改!
  • @PeterKrassoi 是的,这是有效的,但我相信问题是如何自动重构。这将强制所有实现类使用该接口。 OP 表示只有 A 类中的属性被重命名。所以 A.MyName 和 B.Name 将是实现,而接口将不正确。
【解决方案2】:

在 AutoMapper 中,假设您已经处理了映射中的所有属性(通过映射它们或显式忽略它们),Mapper.AssertConfigurationIsValid(); 是解决此问题的方法。

正如documentation 所说:

执行此代码会产生带有描述性消息的 AutoMapperConfigurationException。 AutoMapper 检查以确保每个单独的 Destination 类型成员在源类型上都有对应的类型成员。

因此,在您重构类之后,将不会定义映射,并且测试将失败。

你可以把它放在一个单元测试中,如果你没有任何测试的话,你可以把它放在你的启动代码中。

【讨论】:

  • 此解决方案仅在您调用此方法时有效,例如所有配置的单元测试。构建时间的解决方案会更好一些。
  • 就我个人而言,我不介意开发人员在本地做什么,因为重要的是被检查的内容。如果您有一个封闭的构建过程,在签入成功之前必须通过所有测试,您可以阻止这些被签入。或者,如果您愿意,您可以让它破坏构建和分配责任。
猜你喜欢
  • 2011-11-08
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2014-05-04
相关资源
最近更新 更多