AutoMapper在MVC中的運用04-string對映各種型別、一個屬性對映多個屬性等

Darren Ji發表於2014-02-26

本篇AutoMapper使用場景:

※ 型別轉換,源string型別分別轉換成int, DateTime,Type

※ 源和目標都包含複雜型別屬性

※ 把源中的一個屬性對映到目標中的多個屬性


  型別轉換,源string型別分別轉換成int, DateTime,Type


□ Domain model


    public class Source2

    {

        public string Value1 { get; set; }

        public string Value2 { get; set; }

        public string Value3 { get; set; }

    }


□ View model


    public class Destination2

    {

        public int Value1 { get; set; }

        public DateTime Value2 { get; set; }

        public Type Value3 { get; set; }

    }    


□ 派生TypeConverter<,>自定義轉換


//string轉換成DateTime型別

    public class DateTimeTypeConverter : TypeConverter<string,DateTime>

    {

        protected override DateTime ConvertCore(string source)

        {

            return System.Convert.ToDateTime(source);

        }

    }


    //string轉換成Type型別

    //當然,這裡的string必須是當前專案下的某個類

    public class TypeTypeConverter : TypeConverter<string, Type>

    {

        protected override Type ConvertCore(string source)

        {

            Type type = Assembly.GetExecutingAssembly().GetType(source);

            return type;

        }

    }    


□ 對映配置


Mapper.CreateMap<string, int>().ConvertUsing(Convert.ToInt32);

            Mapper.CreateMap<string, DateTime>().ConvertUsing<DateTimeTypeConverter>();

            Mapper.CreateMap<string,Type>().ConvertUsing<TypeTypeConverter>();

            Mapper.CreateMap<Source2, Destination2>();   


□ 要點


型別轉換用Convertusing<>()方法


  源和目標都包含複雜型別屬性


□ Domain model


    public class OuterSource

    {

        public int Value { get; set; }

        public InnerSource Inner { get; set; }

    }


    public class InnerSource

    {

        public int OtherValue { get; set; }

    }


□ View model


    public class OuterDest

    {

        public int Value { get; set; }

        public InnerDest Inner { get; set; }

    }


    public class InnerDest

    {

        public int OtherValue { get; set; }

    }


□ 對映配置


Mapper.CreateMap<OuterSource, OuterDest>();

Mapper.CreateMap<InnerSource, InnerDest>();


□ 使用


        public ActionResult Nest()

        {

            var source = new OuterSource()

            {

                Value = 5,

                Inner = new InnerSource(){OtherValue = 15}

            };

            var dest = Mapper.Map<OuterSource, OuterDest>(source);

            return View(dest);

        }


□ 要點     


當源和目標都具有複雜屬性並對應,複雜屬性對應的類也需要配置對映。


  把源中的一個屬性對映到目標中的多個屬性


□ Domain model


    public class CalendarEvent

    {

        public DateTime EventDate { get; set; }

        public string Title { get; set; }

    }


    public class CalendarEventForm

    {

        public DateTime EventDate { get; set; }

        public int EventHour { get; set; }

        public int EventMinute { get; set; }

        public string Title { get; set; }

    }


□ 自定義解析器

    

    //轉換成DateTime.Date

    public class DateTimeToDateResolver : ValueResolver<CalendarEvent, DateTime>

    {


        protected override DateTime ResolveCore(CalendarEvent source)

        {

            return source.EventDate.Date;

        }

    }


    //轉換成DateTime.Hour

    public class DateTimeToHourResolver : ValueResolver<CalendarEvent, int>

    {

        protected override int ResolveCore(CalendarEvent source)

        {

            return source.EventDate.Hour;

        }

    }



    //轉換成DateTime.Minute

    public class DateTimeToMinuteResolver : ValueResolver<CalendarEvent, int>

    {

        protected override int ResolveCore(CalendarEvent source)

        {

            return source.EventDate.Minute;

        }

    }


□ 對映配置


 Mapper.CreateMap<CalendarEvent, CalendarEventForm>()

                .ForMember("EventDate", opt => opt.ResolveUsing<DateTimeToDateResolver>())

                .ForMember("EventHour", opt => opt.ResolveUsing<DateTimeToHourResolver>())

                .ForMember("EventMinute", opt => opt.ResolveUsing<DateTimeToHourResolver>());    


□ 使用


        public ActionResult Projection()

        {

            var calendarEvent = new CalendarEvent

            {

                EventDate = new DateTime(2008, 12, 15, 20, 30, 0),

                Title = "Company Holiday Party"

            };


            CalendarEventForm from = Mapper.Map<CalendarEvent, CalendarEventForm>(calendarEvent);

            return View(from);

        }

相關文章