Automapper вложенное отображение - PullRequest
8 голосов
/ 24 октября 2011

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

AutoMapper.Mapper.CreateMap<Address, AddressDTO>();
AutoMapper.Mapper.CreateMap<MatchCompanyRequest, MatchCompanyRequestDTO>();

public class MatchCompanyRequest
{
    Address Address {get;set;}
}

public class MatchCompanyRequestDTO
{
    public CompanyInformationDTO {get;set;}
}

public class CompanyInformationDTO {get;set;}
{
    public string CompanyName {get;set;}
    public AddressDTO Address {get;set;}
}

Но следующий код ...

// works
matchCompanyRequestDTO.companyInformationDTO.Address =
    AutoMapper.Mapper.Map<Address, AddressDTO>(matchCompanyRequest.Address);

// fails
matchCompanyRequestDTO =
    AutoMapper.Mapper
        .Map<MatchCompanyRequest, MatchCompanyRequestDTO>(matchCompanyRequest);

Работает ли это глубокое вложение, и я неправильно его настроил? Или этот тип вложений еще не поддерживается?

- Правка

Для всех, кто заинтересован, я не контролирую DTO.

Ответы [ 3 ]

6 голосов
/ 03 ноября 2011

В нем отсутствует сопоставление адреса с CompanyInformationDTO, поскольку эти объекты находятся на одном уровне гнезда.

Карта создана для MatchCompanyRequest -> MatchCompanyRequestDTO, но она не можетвыяснить, может ли оно отображать Address на CompanyInformationDTO.

Так что ваш MatchCompanyRequestDTO может фактически иметь то же объявление, что и ваше CompanyInformationDTO:

public class MatchCompanyRequestDTO
{
    public string CompanyName {get;set;}
    public AddressDTO Address {get;set;}
}

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

public class CustomResolver : ValueResolver<Address, CompanyInformationDTO>
{
    protected override CompanyInformationDTO ResolveCore(Address source)
    {
        return new CompanyInformationDTO() { Address = Mapper.Map<Address, AddressDTO>(source) };
    }
}
// ...

AutoMapper.Mapper.CreateMap<MatchCompanyRequest, MatchCompanyRequestDTO>()
    .ForMember(dest => dest.companyInformationDTO, opt => opt.ResolveUsing<CustomResolver>().FromMember(src => src.Address)); // here we are telling to use our custom resolver that converts Address into CompanyInformationDTO
5 голосов
/ 29 января 2016

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

У вас есть 2 сущности Пользователи и Уведомления в модели NxN (А у вас есть объект DTO для представления этого), когда вы используете Auto Mapper без указания MaxDepth в выражении вашего маппера: «Хьюстон, у нас есть проблема ":).

Код ниже показывает обходной путь для решения этой проблемы для всех картостроителей. При желании можно определить каждый картограф. Мне нравится этот вопрос

Решение 1 (Глобальное определение)

public class AutoMapperConfig
{
    public static void RegisterMappings()
    {
        Mapper.Initialize(mapperConfiguration =>
        {
            mapperConfiguration.AddProfile<DomainModelToYourDTOsMappingProfile>();
            mapperConfiguration.AddProfile<YourDTOsToDomainModelMappingProfile>();
            mapperConfiguration.AllowNullCollections = true;
            mapperConfiguration.ForAllMaps(
                (mapType, mapperExpression) => {
                    mapperExpression.MaxDepth(1);
                });
        }
    }

Решение 2 (для каждого картографа) * ​​1023 *

 public class AutoMapperConfig
 {
     public static void RegisterMappings()
     {
         Mapper.CreateMap<User, DTOsModel>()
               .MaxDepth(1);
     }
 }
0 голосов
/ 03 ноября 2011

Вместо этого рассмотрим следующее:

public class MatchCompanyRequest
{
    Address Address {get;set;}
}

public class MatchCompanyRequestDTO
{
    public string Name {get;set;}
    public AddressDTO Address {get;set;}
}

public class AddressDTO
{
    ....
}

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

Посмотрите на это: https://github.com/AutoMapper/AutoMapper/wiki/Projection Это объяснит для вас Проекцию, вы можете настроить ее так, чтобы она работала так, как у вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...