- مطالعهی مطالب گروه AutoMapper در سایت، دید خوبی را برای شروع به کار با آن فراهم میکنند و در اینجا قصد تکرار این مباحث پایهای را نخواهیم داشت. هدف بیشتر بررسی یک سری نکات پیشرفتهتر و عمیقتر است از کار با AutoMapper.
- آشنایی با Lazy loading و Eager loading در حین کار با EF
ساختار و پیشنیازهای برنامهی مطلب جاری
جهت سهولت پیگیری مطلب و تمرکز بیشتر بر روی مفاهیم اصلی مورد بحث، یک برنامهی کنسول را آغاز کرده و سپس بستههای نیوگت ذیل را به آن اضافه کنید:
PM> install-package AutoMapper PM> install-package EntityFramework
آشنایی با ساختار مدلهای برنامه
در اینجا ساختار جداول مطالب یک بلاگ را به همراه نویسندگان آنها، مشاهده میکنید:
public class BlogPost { public int Id { get; set; } public string Title { get; set; } public string Content { get; set; } [ForeignKey("UserId")] public virtual User User { get; set; } public int UserId { get; set; } } public class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public virtual ICollection<BlogPost> BlogPosts { get; set; } }
هدف از این مثال
فرض کنید اطلاعاتی که قرار است به کاربر نمایش داده شوند، توسط ViewModel ذیل تهیه میشود:
public class UserViewModel { public int Id { set; get; } public string Name { set; get; } public ICollection<BlogPost> BlogPosts { get; set; } }
تهیه نگاشتهای AutoMapper
برای مدیریت بهتر نگاشتهای AutoMapper توصیه شدهاست که کلاسهای Profile ایی را به شکل ذیل تهیه کنیم:
public class TestProfile : Profile { protected override void Configure() { this.CreateMap<User, UserViewModel>(); } public override string ProfileName { get { return this.GetType().Name; } } }
ثبت و معرفی پروفایلهای AutoMapper
پس از تهیهی پروفایل مورد نیاز، در ابتدای برنامه با استفاده از متد Mapper.Initialize، کار ثبت این تنظیمات صورت خواهد گرفت:
Mapper.Initialize(cfg => // In Application_Start() { cfg.AddProfile<TestProfile>(); });
روش متداول کار با AutoMapper جهت نگاشت اطلاعات User به ViewModel آن
در ادامه به نحو متداولی، ابتدا اولین کاربر ثبت شده را یافته و سپس با استفاده از متد Mapper.Map اطلاعات این شیء user به ViewModel آن نگاشت میشود:
using (var context = new MyContext()) { var user1 = context.Users.FirstOrDefault(); if (user1 != null) { var uiUser = new UserViewModel(); Mapper.Map(source: user1, destination: uiUser); Console.WriteLine(uiUser.Name); foreach (var post in uiUser.BlogPosts) { Console.WriteLine(post.Title); } } }
الف) یافتن اولین کاربر
ب) واکشی لیست مطالب او در یک کوئری دیگر
کاهش تعداد رفت و برگشتها به سرور با استفاده از متدهای ویژهی AutoMapper
در حالت متداول کار با EF، با استفاده از متد Include میتوان این Lazy loading را لغو کرد و در همان اولین کوئری، مطالب کاربر یافت شده را نیز دریافت نمود:
var user1 = context.Users.Include(user => user.BlogPosts).FirstOrDefault();
در این حالت، AutoMapper برای ساده سازی این مراحل، متدهای Project To را معرفی کردهاست:
var uiUser = context.Users.Project().To<UserViewModel>().FirstOrDefault();
بنابراین با استفاده از متدهای Project To میتوان از ذکر Includeهای EF صرفنظر کرد و همچنین دیگر نیازی به نوشتن متد Select جهت نگاشت دستی خواص مورد نظر به خواص ViewModel نیست.
کدهای کامل این قسمت را از اینجا میتوانید دریافت کنید:
AM_Sample01.zip