نحوه کار کردن با کتابخانه AutoMapper در سی شارپ

شنبه 20 مهر 1398

کار کردن با کتابخانه AutoMapper در سی شارپ را حتما باید بیاموزید، در این مطلب درباره کتابخانه AutoMapper در سی شارپ صحبت خواهیم کرد.

 نحوه کار کردن با کتابخانه AutoMapper در سی شارپ

کتابخانه AutoMapper یک کتابخانه محبوب برای مپ کردن به صورت object-to-object در سی شارپ است که می تواند برای مپ کردن اشیایی که متعلق به انواع داده ای dissimilar هستند مورد استفاده قرار گیرد. به عنوان مثال ممکن است شما نیاز داشته باشید که DTO های خود را در اپلیکیشن خود به منظور مدل کردن داده ها مپ کنید. کتابخانه AutoMapper به شما امکان را می دهد تا از تلاش های خسته کننده برای مپ کردن به صورت دستی ویژگی ها از داده های ناسازگار راحت شوید.


یک نکته ابتدایی

برای شروع به کار کردن با لایبرری AutoMapper در سی شارپ شما باید یک پروژه در ویژوال استودیو بسازید و بعد از آن کتابخانه AutoMapper را از طریق NuGet نصب کنید که این کار را می توانید از طریق دستور مربوط به پکیج منیجر NuGet در پنجره کنسول انجام دهید.

PM> Install-Package AutoMapper

 کتابخانه AutoMapper


ساخت mappings با استفاده از کتابخانه AutoMapper

یک مپ کننده به صورت object-to-object مانند کتابخانه AutoMapper یک شی ورودی را از یک نوع به یک شی خروجی از نوع دیگری تبدیل می کند. دو کلاس زیر را در نظر بگیرید:

public class AuthorModel

    {

        public int Id

        {

            get; set;

        }

        public string FirstName

        {

            get;set;

        }

        public string LastName

        {

            get; set;

        }

        public string Address

        {

            get; set;

        }

    }


 public class AuthorDTO

    {

        public int Id

        {

            get; set;

        }

        public string FirstName

        {

            get; set;

        }

        public string LastName

        {

            get; set;

        }

        public string Address

        {

            get; set;

        }

    }

قطعه کد زیر به شما نشان می دهد که چگونه می توانید یک مپ بین دو نوع داده  AuthorModel و AuthorDTO بسازید:

var config = new MapperConfiguration(cfg => {

                cfg.CreateMap<AuthorModel, AuthorDTO>();

            });

بعد از آن برای ایجاد یک مپ بین این دو نوع داده  می توانید به راحتی از قطعه کد زیر استفاده کنید:

IMapper iMapper = config.CreateMapper();

var source = new AuthorModel();

var destination = iMapper.Map<AuthorModel, AuthorDTO>(source)

;

 کتابخانه AutoMapper


یک مثال از کتابخانه AutoMapper

اجازه دهید برای کار کردن با کتابخانه AutoMapper با برخی از داده ها کار کنیم، به قطعه کد زیر توجه کنید که برخی از داده ها را در یک شی سورس ذخیره می کند و بعد از آن مقادیر این ویژگی را در یک شی مقصد نمایش می دهد که البته این کار را بعد از اتمام مپ کردن انجام می دهد.

var config = new MapperConfiguration(cfg => {

                cfg.CreateMap<AuthorModel, AuthorDTO>();

            });

IMapper iMapper = config.CreateMapper();

var source = new AuthorModel();

source.Id = 1;

source.FirstName = "Joydip";

source.LastName = "Kanjilal";

source.Address = "India";

var destination = iMapper.Map<AuthorModel, AuthorDTO>(source);

Console.WriteLine("Author Name: "+ destination.FirstName + " " + destination.LastName)

;

زمانی که شما قطعه کد بالا را اجرا می کنید نام نویسنده که در شی مقصد ذخیره شده است برای شما به نمایش در می آید. با این حال مقادیر ویژگی های firstName خروجی و lastName خروجی دقیقا مانند شی سورس شما خواهند بود چرا که شما اشیا را با استفاده از کتابخانه AutoMapper با موفقیت مپ کرده اید.

 کتابخانه AutoMapper


چند نکته مهم درباره بخش قبل

توجه داشته باشید که کتابخانه AutoMapper می تواند هر مجموعه ای از کلاس ها را مپ کند. با این حال کتابخانه AutoMapper تنها از قراردادهای خاصی پیروی می کند، یکی از این قراردادها این است که نام های ویژگی باید به صورت منحصر به فردی تعریف شده باشند، اگر این نام ها به صورت منحصر به فرد نباشند شما باید به کتابخانه AutoMapper این اطلاعات را بدهید که نام های ویژگی چگونه باید مپ شوند. فرض کنید که ما قصد داریم که دو ویژگی Contact و ContactDetails را با استفاده از کتابخانه AutoMapper مپ کنیم، قطعه کد زیر به ما نشان می دهد که این کار را چگونه می توانیم انجام دهیم:

var config = new MapperConfiguration(cfg => {

                cfg.CreateMap<AuthorModel, AuthorDTO>()

                .ForMember(destination => destination.ContactDetails,

               opts => opts.MapFrom(source => source.Contact));

            });

توجه داشته باشید که دستوری که در ادامه برای شما بیان می کنیم برای ایجاد یک شی خروجی استفاده می شود.

var destination = iMapper.Map<AuthorModel, AuthorDTO>(source);

اگر شی خروجی در حال حاضر موجود باشد شما می توانید از قطعه کد زیر استفاده کنید:

iMapper.Map(sourceObject, destinationObject);

در اصل قطعه کد بالا ممی تواند برای مپ کردن دو شی که در حال حاضر وجود دارند استفاده شود.

 کتابخانه AutoMapper


استفاده از projections در کتابخانه AutoMapper

کتابخانه AutoMapper یک پشتیبانی فوق العاده را از projections برای شما فراهم می کند. Projections در واقع برای مپ کردن مقادیر سورس به یک خروجی که با ساختار سورس سازگار نیست استفاده می شود.( دقیقا نقطه مقابل مپ کردن به صورت one-to-one).

اجازه دهید نگاهی به projections داشته باشیم، قطعه کد زیر را در نظر بگیرید:

public class Address

    {

        public string City { get; set; }

        public string State { get; set; }

        public string Country { get; set; }

    }

اجازه دهید کلاس AuthorModel خود را وادار کنیم که از کلاس Address برای ذخیره کردن اطلاعات مربوط به آدرس نویسنده ها استفاده کند. در این جا کلاس به روز رسانی شده AuthorModel را برای شما آورده ایم:

public class AuthorModel

    {

        public int Id

        {

            get; set;

        }

        public string FirstName

        {

            get;set;

        }

        public string LastName

        {

            get; set;

        }

        public Address Address

        {

            get; set;

        }

    }

و در ادامه نیز کلاس به روز رسانی شده AuthorDTO را برای شما آورده ایم که می توانید آن را مشاهده کنید:

public class AuthorDTO

    {

        public int Id

        {

            get; set;

        }

        public string FirstName

        {

            get; set;

        }

        public string LastName

        {

            get; set;

        }

        public string City { get; set; }

        public string State { get; set; }

        public string Country { get; set; }

    }

حال فرض کنید که ما قصد داریم کلاس های AuthorDTO و AuthorModel را مپ کنیم. قطعه کد زیر به شما نشان می دهد که چگونه می توانید این کار را انجام دهید.

var config = new MapperConfiguration(cfg => {

                cfg.CreateMap<AuthorDTO, AuthorModel>()

                   .ForMember(destination => destination.Address,

              map => map.MapFrom(

                  source => new Address

                  {

                      City = source .City,

                      State = source .State,

                      Country = source.Country
            }));
      

شما می توانید با کمی جست و جو اطلاعات بیشتری را در خصوص این موضوع بدست بیاورید.

ایمان مدائنی

نویسنده 1299 مقاله در برنامه نویسان
  • C#.net
  • 2k بازدید
  • 0 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

تاکنون هیچ کاربری از این پست تشکر نکرده است

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید