小编典典

AutoMapper vs ValueInjecter

all

每次我寻找AutoMapper的东西时,我都会读一些关于ValueInjecter的东西。

谁能告诉我它们之间的优缺点(性能、特性、API 使用、可扩展性、测试)?


阅读 86

收藏
2022-06-25

共1个答案

小编典典

作为ValueInjecter的创建者,我可以告诉你我这样做是因为我想要一些
简单且非常灵活的东西

我真的不喜欢写太多或写很多monkey code像:

Prop1.Ignore, Prop2.Ignore etc.
CreateMap<Foo,Bar>(); CreateMap<Tomato, Potato>(); etc.

ValueInjecter 类似于带有插件的 mozilla, 您可以创建 ValueInjections 并使用它们

有用于扁平化、非扁平化和一些旨在被继承的内置注入

而且它更多地 以方面类型的方式 工作,您不必一对一地指定所有属性,而是执行以下操作:

从源中获取名称以“Id”结尾的所有 int 属性,转换值并将每个属性设置为源对象中具有相同名称但没有 Id
后缀的属性,并且它的类型是从实体继承的,类似的东西

所以一个明显的区别是,ValueInjecter 甚至在具有展平和非展平的 Windows 窗体中都使用,这就是它的灵活性

(从对象映射到表单控件并返回)

Automapper,不能在 Windows 窗体中使用,没有展开,但它有像集合映射这样的好东西,所以如果你需要
ValueInjecter,你只需执行以下操作:

foos.Select(o => new Bar().InjectFrom(o));

您还可以使用 ValueInjecter 从 匿名动态 对象映射

区别:

  • 自动映射器为每个映射可能性创建配置 CreateMap()

  • valueinjecter 从任何对象注入到任何对象(也有从对象注入到 valuetype 的情况)

  • automapper 已扁平化构建它,仅适用于简单类型或相同类型,并且它没有 unflattening

  • valueinjecter 仅在您需要时才这样做target.InjectFrom<FlatLoopValueInjection>(source); also <UnflatLoopValueInjection> ,并且如果您想要Foo.Bar.Name of type String继承FooBarName of type Class1FlatLoopValueInjection 并指定它

  • automapper 默认映射具有相同名称的属性,其余的您必须一一指定,并执行诸如 Prop1.Ignore()、Prop2.Ignore() 之类的操作。

  • valueinjecter 有一个默认注入 .InjectFrom() ,它执行具有相同名称和类型的属性;对于其他所有内容,您使用单独的映射逻辑/规则创建自定义值注入,更像方面,例如 从 Foo 类型的所有道具到 Bar 类型的所有道具

2022-06-25