Подтвердить что ты не робот

Настройте AutoMapper для сопоставления конкретным типам, но позвольте интерфейсам в определении моего класса

У меня есть код, похожий на то, что ниже. В основном это представляет получение данных из веб-службы и преобразование ее в объекты на стороне клиента.

void Main()
{
    Mapper.CreateMap<SomethingFromWebService, Something>();    
    Mapper.CreateMap<HasSomethingFromWebService, HasSomething>(); 
    // Service side
    var hasSomethingFromWeb = new HasSomethingFromWebService();
    hasSomethingFromWeb.Something = new SomethingFromWebService
            { Name = "Whilly B. Goode" };
    // Client Side                
    HasSomething hasSomething=Mapper.Map<HasSomething>(hasSomethingFromWeb);  
}    
// Client side objects
public interface ISomething
{
    string Name {get; set;}
}    
public class Something : ISomething
{
    public string Name {get; set;}
}    
public class HasSomething
{
    public ISomething Something {get; set;}
}    
// Server side objects
public class SomethingFromWebService
{
    public string Name {get; set;}
}    
public class HasSomethingFromWebService
{
    public SomethingFromWebService Something {get; set;}
}

Проблема заключается в том, что я хочу использовать интерфейсы в моих классах (HasSomething.ISomething в этом случае), но мне нужно иметь карту AutoMapper для конкретных типов. (Если я не сопоставляю конкретные типы, то AutoMapper создаст прокси для меня. Это вызывает другие проблемы в моем приложении.)

Приведенный выше код дает мне эту ошибку:

Отсутствует конфигурация карты типа или неподдерживаемое отображение.

Типы отображения: SomethingFromWebService → ISomething
UserQuery + SomethingFromWebService → UserQuery + ISomething

Итак, мой вопрос: как я могу сопоставить конкретный тип и все еще использовать интерфейсы в своем классе?

ПРИМЕЧАНИЕ: Я попытался добавить это сопоставление:

Mapper.CreateMap<SomethingFromWebService, ISomething>();

Но тогда возвращаемый объект не имеет тип Something, он возвращает сгенерированный прокси, используя ISomething в качестве шаблона.

4b9b3361

Ответ 1

Итак, я понял, что работает.

Если я добавлю эти два отображения:

Mapper.CreateMap<SomethingFromWebService, Something>();
Mapper.CreateMap<SomethingFromWebService, ISomething>().As<Something>(); 

тогда он работает так, как я хочу.

Мне не удалось найти документацию по методу "Как" (попробуйте выполнить поиск в Google!), но, похоже, это перенаправление сопоставления.

Например: для этого сопоставления (ISomething) разрешите его As a Something.