每当我在StackOverflow上寻找AutoMapper内容时,我都会在阅读有关ValueInjecter的内容。
有人可以告诉我它们之间的优缺点(性能,功能,API使用率,可扩展性,测试)吗?
作为ValueInjecter的创建者,我可以告诉你我这样做是因为我想要 简单,非常灵活的* 东西 *
我真的不喜欢写太多或写很多monkey code类似的东西:
monkey code
Prop1.Ignore, Prop2.Ignore etc. CreateMap<Foo,Bar>(); CreateMap<Tomato, Potato>(); etc.
ValueInjecter 类似于mozilla,带有其插件, 您可以创建ValueInjections并使用它们
有内置的用于扁平化,非扁平化的注入,还有一些旨在继承
并且它 以方面类型的方式 工作得更多,您不必指定所有属性为1对1,而是可以执行以下操作:
从名称中以“ Id”结尾的源中获取所有int属性,转换值并将每个属性设置为源对象中具有相同名称的属性(不带Id后缀),并且其类型从Entity继承,诸如此类
所以一个明显的区别是,ValueInjecter即使在具有展平和展平的Windows窗体中也可以使用,这就是它的灵活性
(从对象映射到窗体控件,然后再返回)
Automapper,在Windows窗体中不可用,没有展开,但是它具有诸如集合映射之类的好东西,因此,如果需要ValueInjecter来使用它,则可以执行以下操作:
foos.Select(o => new Bar().InjectFrom(o));
您还可以使用ValueInjecter来映射 匿名 和 动态 对象
差异:
自动映射器为每种映射可能性创建配置CreateMap()
从任何对象到任何对象的valueinjecter注入(在某些情况下,从对象到valuetype的注入)
automapper已构建扁平化,并且仅用于简单类型或相同类型,并且不具有扁平化
valueinjecter只有当你需要它,你做的target.InjectFrom<FlatLoopValueInjection>(source); also <UnflatLoopValueInjection> ,如果你想从Foo.Bar.Name of type String给FooBarName of type Class1你继承FlatLoopValueInjection并指定此
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类型的所有道具