作为创造者价值注入器,我可以告诉你,我这么做是因为我想要一些东西简单且非常灵活
我真的不喜欢写太多或写很多monkey code
like:
Prop1.Ignore, Prop2.Ignore etc.
CreateMap<Foo,Bar>(); CreateMap<Tomato, Potato>(); etc.
ValueInjecter 是个东西就像 Mozilla 及其插件一样,您创建 ValueInjections 并使用它们
有用于扁平化、反扁平化的内置注入,以及一些旨在继承的注入
它更适用于方式的方面类型,您不必一对一地指定所有属性,而是执行以下操作:
从源中获取名称以“Id”结尾的所有 int 属性,转换值并将每个属性设置为源对象中具有相同名称但不带 Id 后缀的属性,并且其类型是从 Entity 继承的,类似的东西
所以一个明显的区别是,ValueInjecter 即使在具有扁平化和非扁平化的 Windows 窗体中也可以使用,这就是它的灵活性
(从对象到表单控件的映射以及返回)
Automapper,在 Windows 窗体中不可用,没有展开,但它有像集合映射这样的好东西,所以如果你需要它与 ValueInjecter 你只需做类似的事情:
foos.Select(o => new Bar().InjectFrom(o));
您还可以使用 ValueInjecter 进行映射匿名的 and dynamic objects
差异:
自动映射器为每个映射可能性创建配置 CreateMap()
valueinjecter 从一个对象注入到任何对象(也有从对象注入到值类型的情况)
automapper 内置了扁平化功能,并且仅适用于简单类型或相同类型,并且它没有取消扁平化功能
valueinjecter 仅当您需要时才这样做target.InjectFrom<FlatLoopValueInjection>(source); also <UnflatLoopValueInjection>
如果你想从Foo.Bar.Name of type String
to FooBarName of type Class1
您继承 FlatLoopValueInjection 并指定它
automapper 默认映射具有相同名称的属性,其余的你必须一一指定,并执行诸如 Prop1.Ignore()、Prop2.Ignore() 等操作。
valueinjecter 有一个默认注入 .InjectFrom() ,它执行具有相同名称和类型的属性;对于其他一切,您可以使用单独的映射逻辑/规则创建自定义值注入,更像是方面,例如从 Foo 类型的所有 props 到 Bar 类型的所有 props