2013-03-25 2 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

написать собственный автопилот? этот тип проблемы намного сложнее, чем вы думаете. Подумайте о создании структуры данных графа для отслеживания «транзитивного» отображения. –

+1

Извините, но я увидел «струйный сыр» и подумал «вкусный!». Игнорируйте это. –

+0

Вы не можете, Никаких решений, кроме Mapper.CreateMap (...) –

ответ

0

Как это сделать без явного создания карты между мышью до a Dog?

Ответ прост: вы не можете.

У Automapper есть довольно простая логика для отображения объектов. При добавлении нового отображения:

Mapper.CreateMap<Mouse, Cat>(); 

Новый TypeMap создается и добавляется в список карт типа. Да, есть простой список. И каждый TypeMap имеет два свойства: DestinationType и SourceType. Ничего посредине. Когда вы пытаетесь сопоставить некоторый объект, тогда список просто ищет первый TypeMap, который имеет точно такие же исходные и целевые типы, как указано в вашем сопоставлении. Это делается со следующим методом (ConfigurationStore класса отвечает за проведение настроенных сопоставлений):

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

Так, для образца там будут два TypeMap объектов в списке, и, конечно, ни один из них не соответствует условию из DestinationType equalt в Dog и SourceType, равным Mouse.

+0

Знаете ли вы, возможно ли это с другими структурами отображения, такими как Value Injector или Glue? – Levitikon

+0

@ Levitikon извините, не использовали их (вы можете задать другой вопрос по этим картографам). Но я не думаю, что это возможно. –

+0

@ Levitikon Рассмотрите следующие. У вас есть отображения для 'A-> C',' A-> B', 'C-> D' и' B-> D'. Довольно легально, да? Но что должно произойти, когда вы переводите 'A' в' D'? Должны ли мы идти 'A-> B-> D' путь, или' A-> C-> D'? Кроме того, каркас отображения должен быть очень быстрым, потому что чаще всего они используются для отображения объектов DTO в объекты (или для просмотра моделей) туда и обратно. Таким образом, производительность имеет значение. –

Смежные вопросы