每次我寻找AutoMapper的东西时,我都会读一些关于ValueInjecter的东西。
谁能告诉我它们之间的优缺点(性能、特性、API 使用、可扩展性、测试)?
作为ValueInjecter的创建者,我可以告诉你我这样做是因为我想要一些 简单且非常灵活的东西
我真的不喜欢写太多或写很多monkey code像:
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 并指定它
target.InjectFrom<FlatLoopValueInjection>(source); also <UnflatLoopValueInjection>
Foo.Bar.Name of type String
FooBarName of type Class1
automapper 默认映射具有相同名称的属性,其余的您必须一一指定,并执行诸如 Prop1.Ignore()、Prop2.Ignore() 之类的操作。
valueinjecter 有一个默认注入 .InjectFrom() ,它执行具有相同名称和类型的属性;对于其他所有内容,您使用单独的映射逻辑/规则创建自定义值注入,更像方面,例如 从 Foo 类型的所有道具到 Bar 类型的所有道具