时间:2010-07-26 16:39:25

标签: automapper

3 个答案:

答案 0 :(得分:5)

如果您决定不再忽略基类中的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>();

答案 1 :(得分:2)

答案 2 :(得分:2)

有一种更好的方法。对于我们的项目,我们创建了具有以下结构的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。

使用此映射描述,我们可以根据我们的用例选择Flat或Full配置。我们使用AutoMapper在与Ria Services一起使用的nHibernate实体和Dto之间进行映射,我们对此解决方案非常满意。