您的位置:首页 > 移动开发

AutoMapper 复杂类型间的自己定义相互匹配

2015-10-21 14:16 197 查看
Automapper 功能强大,但是只能识别和匹配简单类型且同名的变量,遇到自定义类型,及复杂类型如果依旧使用最简单的匹配法则就会弹出

AutoMapper.AutoMapperMappingException】的异常

【之后会讲如何找到关键性错误】

例:转化目标是:

namespace SchoolModel
{
    public class schoolModel
    {
        public StudentModel students;
        public TeacherModel Teachers;
        public List<OtherModel> others;
        public string one;
        public string two;

    }

    public class OtherModel
    {
        public NameModel name;
        public string one;
        public string two;

    }

    public class TeacherModel
    {
        public NameModel name;
        public string one;
        public string two;
    }

    public class StudentModel
    {
        public NameModel name;
        public string one;
        public string two;
    }

    public class NameModel
    {
        public string firstName;
        public string lastName;
    }
}


转化来源是:

namespace School
{
    public class school
    {
        public Student students;
        public Teacher Teachers;
        public List<Other> others;
        public string one;
        public string two;

    }

    public class Other
    {
        public Name name;
        public string one;
        public string two;

    }

    public class Teacher
    {
        public Name name;
        public string one;
        public string two;
    }

    public class Student
    {
        public Name name;
        public string one;
        public string two;
    }

    public class Name
    {
        public string firstName;
        public string lastName;
    }
}


其中包含着三层的自定义结构,还有List类型

唯一只包含简单类型的事Name,所以能直接使用匹配的是Name

同时如果是这种比较复杂的结构体建议使用configuration来定义mapper规则

<pre name="code" class="csharp">    class MapSchool:Profile
    {
        protected override void Configure()
        {
            var map = Mapper.CreateMap<school, schoolModel>();
            map.ForMember(sou => sou.Teachers, dto => dto.MapFrom(src => src.Teachers))
                .ForMember(sou => sou.others, dto => dto.MapFrom(src => src.others))
                .ForMember(sou => sou.students, dto => dto.MapFrom(src => src.students));

            Mapper.CreateMap<Name, NameModel>().ConstructUsing(s => new NameModel
            {
                firstName = s.firstName,
                lastName = s.lastName
            });

        }
}




如上代码所示,在school这一层就只需要匹配好在school这一层的代码即可,同时,由于teacher,和student中都包含这Name的元素,mapper无法识别,所以同时也要定义好Name=>NameModel的转换规则。

同理,不管层级多复杂,只要在Configure()中定义好Mapper无法识别的类型即可。

在应用时,直接添加Profigure就可以应用自定义的匹配方法了

public void Main()
        {
            school schoolTemp = new school()
            {
                // 赋值
            };
            Mapper.CreateMap<school, schoolModel>();
            Mapper.AddProfile(new MapSchool());
            schoolModel schoolModelTemp=Mapper.Map<school, schoolModel>(schoolTemp);
        }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: