Automapper 将 2 个实体映射到单个 class
Automapper mapping 2 entities to a single class
只是想知道这是否可能:
假设我有一个用于比较新旧实体的 ViewModel。
public class FooComparison
{
public string Name {get;set;}
public string OldName {get; set;}
public int Age {get; set;}
public int OldAge {get; set;}
...
}
我想从数据库加载 Foo 的 2 个实例,并使用两个实例的详细信息填充 FooComparison。
现在,我 Mapper.CreateMap<Foo, FooComparison>()
将从第一个实体填充姓名、年龄等 - 是否有一种简单的方法可以从第二个实体填充 Oldxxx 属性,而无需循环和手动更新它们?
我的建议是定义一个从 Tuple<Foo, Foo>
到 FooComparison
的映射:
Mapper.CreateMap<Tuple<Foo, Foo>, FooComparison>()
.ConvertUsing(x => new FooComparison
{
Name = x.Item2.Name,
OldName = x.Item1.Name,
Age = x.Item2.Age,
OldAge = x.Item1.Age,
...
});
然后像这样使用它:
Foo oldFoo = ...;
Foo newFoo = ...;
FooComparison comparison = Mapper.Map<FooComparison>(Tuple.Create(oldFoo, newFoo));
我很欣赏这失去了 automapper 的 "auto" 部分,但使用 automapper 获得的最大好处是这个映射只在软件的一个地方定义,而不是 auto部分。
我个人发现这种通过 Tuple
映射的方式非常有效。
只是想知道这是否可能:
假设我有一个用于比较新旧实体的 ViewModel。
public class FooComparison
{
public string Name {get;set;}
public string OldName {get; set;}
public int Age {get; set;}
public int OldAge {get; set;}
...
}
我想从数据库加载 Foo 的 2 个实例,并使用两个实例的详细信息填充 FooComparison。
现在,我 Mapper.CreateMap<Foo, FooComparison>()
将从第一个实体填充姓名、年龄等 - 是否有一种简单的方法可以从第二个实体填充 Oldxxx 属性,而无需循环和手动更新它们?
我的建议是定义一个从 Tuple<Foo, Foo>
到 FooComparison
的映射:
Mapper.CreateMap<Tuple<Foo, Foo>, FooComparison>()
.ConvertUsing(x => new FooComparison
{
Name = x.Item2.Name,
OldName = x.Item1.Name,
Age = x.Item2.Age,
OldAge = x.Item1.Age,
...
});
然后像这样使用它:
Foo oldFoo = ...;
Foo newFoo = ...;
FooComparison comparison = Mapper.Map<FooComparison>(Tuple.Create(oldFoo, newFoo));
我很欣赏这失去了 automapper 的 "auto" 部分,但使用 automapper 获得的最大好处是这个映射只在软件的一个地方定义,而不是 auto部分。
我个人发现这种通过 Tuple
映射的方式非常有效。