У меня есть код, похожий на то, что ниже. В основном это представляет получение данных из веб-службы и преобразование ее в объекты на стороне клиента.
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 в качестве шаблона.