2013-03-25 78 views
0

可以说我有这些模型Automapper,通过链接关联映射对象?

public class Mouse 
    { 
     public string Cheese { get; set; } 
    } 

    public class Cat 
    { 
     public string Hairball { get; set; } 
    } 

    public class Dog 
    { 
     public string ChewyToy { get; set; } 
    } 

我一个鼠标映射到猫那么猫到狗:

Mapper.CreateMap<Mouse, Cat>().ForMember(m => m.Hairball, o => o.MapFrom(src => src.Cheese)); 
    Mapper.CreateMap<Cat, Dog>().ForMember(m => m.ChewyToy, o => o.MapFrom(src => src.Hairball)); 

推而广之,鼠标也应该被映射到一个狗,对? 当我试图在两者之间映射:

var mouse = new Mouse() { Cheese = "Eat me" }; 

    Dog dog = Mapper.Map<Mouse, Dog>(mouse); 

我得到一个异常:

试图App_Start.MapConfig +鼠标映射到 App_Start.MapConfig +狗。发生类型为 的异常'AutoMapper.AutoMapperMappingException'。

我该如何做到这一点,没有明确地创建一个鼠标之间的映射狗?这是一个更大问题的简单例子。如果他们支持这种行为,我也愿意切换框架,如Value Injector,Glue等。

+0

编写您自己的Automapper?这种类型的问题比你想象的要困难得多。考虑创建一个图形数据结构来跟踪“传递”映射。 – 2013-03-25 14:22:16

+1

对不起,但我看到'串奶酪',并认为“美味!”忽略这个。 – 2013-03-25 14:28:14

+0

你不能,除了Mapper.CreateMap (...) – 2013-03-25 17:19:15

回答

0

我该如何做到这一点,没有明确地创建一个鼠标到 之间的地图狗?

答案很简单:你不能

Automapper具有非常直接的映射对象逻辑。当你添加新的映射:

Mapper.CreateMap<Mouse, Cat>(); 

TypeMap被创建并添加到类型映射列表。是的,有简单的列表。并且每个TypeMap有两个属性:DestinationTypeSourceType。没有在中间。当您尝试映射某个对象时,首先简单地搜索列表TypeMap,它具有完全相同的源和目标类型,如映射中所指定的那样。它是用下面的方法做(ConfigurationStore类是负责保存配置的映射):

TypeMap FindExplicitlyDefinedTypeMap(Type sourceType, Type destinationType) 
{ 
    return this._typeMaps.FirstOrDefault<TypeMap>(x => 
       ((x.DestinationType == destinationType) && 
       (x.SourceType == sourceType))); 
} 

所以,为您的样品会出现在列表中有两个TypeMap对象,当然他们都不匹配DestinationType equalt的条件DogSourceType等于Mouse

+0

你知道它是否可以与其他映射框架,如Value Injector或Glue? – Levitikon 2013-03-25 15:12:35

+0

@Levitikon抱歉,没有使用它们(你可以在这些映射器上提出另一个问题)。但我不认为这是可能的。 – 2013-03-25 15:16:46

+0

@Levitikon请考虑以下事项。你有'A-> C','A-> B','C-> D'和'B-> D'的映射。非常合法,是吗?但是当你将'A'映射到'D'时会发生什么?我们应该去'A-> B-> D'路径,还是'A-> C-> D'? 另外映射框架应该是非常快的,因为大多数情况下它们被用来映射DTO对象来实体(或查看模型)来回。所以,表演很重要。 – 2013-03-25 15:21:37