2014-09-30 5 views
0

У меня есть базовый классAutomapper абстрактный класс

public abstract class DtoBase //NOTICE that this class is abstract 
{ 
    //some DTO specific things 
} 

public class concreteA_Dto : DtoBase 
{ 
    //some properties from A 
} 

public class concreteB_Dto : DtoBase 
{ 
    //some properties from B 
} 

, а затем у меня есть некоторые классы, и они не знают друг друга и

public class concreteA //NOTICE that there is NO base class 
{ 
    //some properties from A 
} 

public class concreteB 
{ 
    //some properties from B 
} 

Что я хочу использовать Automapper таким образом:

private DtoBase GetResourceDto(object value) 
{ 
    return Mapper.Map<DtoBase>(value); 
} 

До сих пор мое сопоставление выглядело так:

CreateMap<concreteA, DtoBase>() 
    .Include<concreteA, concreteA_Dto>(); 

CreateMap<concreteA, concreteA_Dto>(); 

Но когда я называю метод GetResourceDto с некоторым экземпляром concreteA я получит

Automapper исключение:

Mapping types: 
concreteA-> DtoBase 
#NAMESPACE.concreteA -> #NAMESPACE.DtoBase 

Destination path: 
DtoBase 

с внутренним исключением не может быть создана

Экземпляры абстрактных классов.

Обратите внимание, что #NAMESPACE мое пространство имен класса

Как выполнить правильное отображение, которое позволит избежать этого исключения?

Идея заключается в том, что concreteA и concreteB может dynamicaly расти во времени и там может быть Concretec, забетонированы и т.д. Я не возражаю, добавив отображения для более конкретных классов

+0

Вы не можете отобразить на абстрактный класс, AutoMapper создает новый экземпляр класса вы отображающие до и, как говорит об ошибке, вы не можете создать экземпляр абстрактного класса. Сделайте свой базовый класс конкретным, и он будет работать, абстрактный класс не подходит, потому что вы хотите создать его экземпляры. –

+0

На самом деле я не хочу создавать экземпляр DtoBase, который я ожидаю как возвращаемое значение из GetResourceDto, является экземпляром конкретногоA_Dto. – LightCZ

+0

При использовании automapper, как это, иерархии классов должны совпадать. Если вы создаете базовый класс в «конкретной» иерархии, все должно работать нормально. –

ответ

0

Вы можете часто имеют аналогичные проблемы отображения, если вы не Использовать суррогатные классы для отображения.

Создайте классы суррогатов для каждого класса, который вы хотите сопоставить.

Вы можете получить дополнительную помощь от here

+0

Спасибо, я догадываюсь, что из архитектонического представления должны быть суррогатные классы, и должен быть тот базовый класс, как указал Бен и Андрей. Я реорганизую свое решение и добавлю эту часть – LightCZ

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