Проблема с игнорированием свойства базового класса в отображениях дочерних классов с использованием Automapper - PullRequest
5 голосов
/ 26 июля 2010

У меня есть сценарий, в котором я хотел бы игнорировать некоторые свойства классов, определенных в базовом классе.

У меня есть начальное отображение, подобное этому

   Mapper.CreateMap<Node, NodeDto>()
                .Include<Place, PlaceDto>()
                .Include<Asset, AssetDto>();

Затем я настроил его так, чтобы игнорировать одно из свойств, определенных в базовом классе NodeDto

 Mapper.CreateMap<Node, NodeDto>()
                .ForMember(dest => dest.ChildNodes, opt => opt.Ignore());

Однако, когда я пытаюсь сопоставить Place to PlaceDto или Asset AssetDto, свойство ChildNodes не игнорируется. Так что я закончил тем, что делал, как это

  Mapper.CreateMap<Node, NodeDto>()
                .ForMember(dest => dest.ChildNodes, opt => opt.Ignore());
            Mapper.CreateMap<Place, PlaceDto>()
                .ForMember(dest => dest.ChildNodes, opt => opt.Ignore());
            Mapper.CreateMap<Asset, AssetDto>()
                .ForMember(dest => dest.ChildNodes, opt => opt.Ignore());

Так как у меня много дочерних классов для NodeDto, описанный выше процесс громоздок, и я хотел бы знать, есть ли лучший подход?

Спасибо Набиль

Ответы [ 3 ]

5 голосов
/ 28 марта 2011

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

    public static class MappingExtensions
    {
        public static IMappingExpression<Node, NodeDto> MapNodeBase<Node, NodeDto>(
            this IMappingExpression<Node, NodeDto> mappingExpression)
        {
            // Add your additional automapper configuration here
            return mappingExpression.ForMember(
                dest => dest.ChildNodes, 
                opt => opt.Ignore()
            );
        }
    }

Который вы бы тогда назвали так:

Mapper.CreateMap<Node, NodeDto>()
            .MapNodeBase()
            .Include<Place, PlaceDto>()
            .Include<Asset, AssetDto>();
2 голосов
/ 30 мая 2011

Есть лучший способ. Для нашего проекта мы создали файл mappings.xml со следующей структурой.

<mappings>
  <mapping name="EntityOne">
    <configuration name="Flat">
      <ignore name="ChildCollectionOne"/>
      <ignore name="ChildCollectionTwo"/>
      <ignore name="ChildCollectionThree"/>
    </configuration>
    <configuration name="Full">
      <include name="ChildCollectionOne" configuration="Flat" type="One"/>
      <include name="ChildCollectionTwo" configuration="Flat" type="Two"/>
      <include name="ChildCollectionThree" configuration="Flat" type="Three"/>
    </configuration>
  </mapping>
</mappings>

Специальный класс AutoMapperUtilis используется для анализа данных в формате xml и настройки Automapper в соответствии с заданными правилами.

Вызов:

AutoMapperUtil.Init(typeof(EntityOne),typeof(EntityOneDto), AutoMapperUtilLoadType.Flat);

После этого все необходимые отображения автоматически загружаются, а указанные ChildCollections игнорируются.

С этими описаниями сопоставлений мы можем выбирать между плоской или полной конфигурацией в зависимости от нашего варианта использования. Мы используем AutoMapper для отображения между сущностями nHibernate и Dto, которые используются с Ria Services, и мы очень довольны этим решением.

2 голосов
/ 26 июля 2010

извините, но нет, другого пути нет, вот как работает автомаппер

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