AutoMapper زندگی را آسان می کند، اما محدودیت هایی دارد. یاد بگیرید که چگونه یک نگاشت سفارشی را برای مدیریت ساختارهای داده پیچیده یا انواع ناسازگار پیاده سازی کنید.
هنگام کار بر روی برنامهها، اغلب باید یک نوع را به دیگری تبدیل کنید. نگاشت شی فرآیند نگاشت یک شی مبدا به یک شی مقصد است، که در آن ممکن است انواع شی مبدا و مقصد متفاوت باشد.
برای مثال، ممکن است لازم باشد نمونه ای از یک کلاس را از نمونه ای از کلاس دیگر ایجاد کنید، سپس داده ها را از شی مبدا به شی مقصد کپی کنید. اگرچه نقشهبردارهای شی بسیاری برای استفاده وجود دارد، ممکن است لازم باشد نقشهبردارهای سفارشی خود را در شرایط خاص پیادهسازی کنید. در این مقاله، خواهیم دید که چگونه میتوانیم یک نگاشت شی ساده اما سریع در سی شارپ پیادهسازی کنیم.
یک پروژه برنامه کاربردی کنسول در ویژوال استودیو ایجاد کنید
ابتدا، اجازه دهید یک پروژه برنامه کاربردی کنسول NET Core در ویژوال استودیو ایجاد کنیم. با فرض اینکه Visual Studio 2022 در سیستم شما نصب شده است، مراحل ذکر شده در زیر را برای ایجاد یک پروژه برنامه کاربردی کنسول NET Core جدید دنبال کنید.
- Visual Studio IDE را راه اندازی کنید.
- روی “ایجاد پروژه جدید” کلیک کنید.
- در پنجره “ایجاد پروژه جدید”، “Console App (.NET Core)” را از لیست الگوهای نمایش داده شده انتخاب کنید.
- بعدی را کلیک کنید.
- در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
- بعدی را کلیک کنید.
- در پنجره “اطلاعات اضافی”، “NET 8.0 (پشتیبانی طولانی مدت)” را به عنوان نسخه چارچوبی که می خواهید استفاده کنید انتخاب کنید.
- روی ایجاد کلیک کنید.
ما از این پروژه برنامه کاربردی کنسول NET 8 برای پیادهسازی یک نگاشت شی سفارشی در بخشهای بعدی این مقاله استفاده خواهیم کرد.
مزایا و محدودیت های AutoMapper
کتابخانه نگاشت اشیاء محبوب AutoMapper یک انتخاب عالی برای زمانی است که می خواهید اشیایی از انواع ناسازگار را با نام و ساختار ویژگی مشابه نقشه برداری کنید. AutoMapper به خوبی با Entity Framework کار می کند و نوشتن تست های واحد برای انواعی که از AutoMapper استفاده می کنند آسان است. زمانی که نگاشت بین انواع را تنظیم کرده اید، تنها کاری که باید انجام دهید این است که چند خط کد بنویسید تا ویژگی های نمونه مقصد را آزمایش کنید.
AutoMapper دارای چندین مزیت است که آن را به یکی از پرکاربردترین کتابخانه های نقشه برداری در سراسر جهان تبدیل می کند. با این وجود، سناریوهایی وجود دارد که در آنها باید به جای استفاده از هر نگاشت شی شخص ثالث، نقشهبردارهای شی سفارشی خود را طراحی کنیم. به عنوان مثال، در حالی که میتوانید از AutoMapper زمانی استفاده کنید که نوع مقصد شامل زیرمجموعهای مسطح از ویژگیهای نوع مبدا باشد، AutoMapper برای معماریهای لایهای پیچیده یا معماریهایی که به منطق نگاشت پیچیده بین اشیاء نیاز دارند مناسب نیست. انواع ناسازگار.
علاوه بر این، حتی اگر از آخرین نسخه های AutoMapper در برنامه خود استفاده می کنید، اشکالاتی در عملکرد وجود دارد که باید از آنها آگاه باشید. اگر از یک نقشهبردار سفارشی استفاده میکنید، کنترل دقیقتری بر طرح خواهید داشت، به این معنی که میتوانید کدی را برای بهینهسازی نگاشت شی سفارشی خود بنویسید.
نقشهبردار شی سفارشی چیست؟ چرا به آن نیاز داریم؟
یک نگاشت شی سفارشی جزء مورد استفاده برای نگاشت یا تبدیل یک شی مبدا از یک نوع به یک شی مقصد از نوع دیگر است. شما می توانید از یک نگاشت شی سفارشی برای مدیریت منطق نقشه برداری پیچیده استفاده کنید و منطق نگاشت را برای برآوردن نیازهای برنامه خود تنظیم کنید. نقشهبردارهای شی سفارشی در سناریوهایی که نیاز به نقشهبرداری از اشیاء با انواع ناسازگار دارید، مفید هستند، به عنوان مثال، زمانی که انواع هیچ رابطه نگاشت ذاتی ندارند.
نقشهنگار شی سفارشی خواندن و نگهداری کد را آسانتر میکند و به شما امکان میدهد از نگاشتها بین پروژهها دوباره استفاده کنید. زمان پردازش هدر رفته در نگاشت های دستی را کاهش می دهد و انعطاف پذیری بیشتری برای رسیدگی به سناریوهای پیچیده با مجموعه های اشیاء تودرتو فراهم می کند. اگر از یک نگاشت شی سفارشی استفاده می کنید، می توانید داده ها را بین ساختارهای داده پیچیده و متنوع نگاشت کنید.
شما می توانید با کپسوله کردن آن در یک نگاشت سفارشی و سپس استفاده مجدد از آن در سراسر برنامه، از نوشتن منطق نقشه برداری غیر ضروری جلوگیری کنید. هنگام توسعه مدلها و موجودیتهایی که برنامه شما را تشکیل میدهند، برای دستیابی به سرعت مطلوب، توصیه میشود از ساختارهای داده سبک به جای ساختارهای سنگین استفاده کنید.
مورد استفاده معمولی برای نگاشت شی سفارشی
در اینجا چند دلیل وجود دارد که ممکن است نیاز به استفاده از یک نگاشت شی سفارشی داشته باشید:
- پشتیبانی از نگاشت ساختارهای داده ناسازگار: یک شی نگاشت شکاف بین دو کلاس یا ساختار داده ای که اطلاعات مشابهی را نشان می دهند، اما دارای نام ها، انواع یا ساختارهای دارایی متفاوتی هستند، پر می کند. حتی اگر اشیاء دارای نامها یا ساختارهای داده مشابه یا غیرمشابه باشند، میتوانید از یک نگاشت شی برای کپی دادهها از شی مبدا به شی مقصد استفاده کنید.
- پشتیبانی از ادغام با اجزای خارجی: هنگام کار با APIهای خارجی یا پایگاه داده، ممکن است لازم باشد مدل های داده ای را مدیریت کنید که کاملاً با مدل های داده داخلی شما همسو نیستند. میتوانید از یک نگاشت شی سفارشی برای مدیریت منطق نگاشت بین سیستمها و ساختارهای داده مختلف، عمدتاً برای انواعی که نامهای ویژگی متفاوتی دارند، استفاده کنید.
- پشتیبانی از نسخهسازی: با گذشت زمان، نرمافزار شما مطابق با تغییرات مورد نیاز کسبوکار تکامل مییابد. این الزامات ممکن است شامل ریشهکن کردن انواع و مدلهای قدیمی و معرفی انواع و مدلهای جدید باشد. اگر از نقشهبردار سفارشی بهجای نقشهبردار شخص ثالث مانند AutoMappеr استفاده میکنید، میتوانید به راحتی تغییر را به نسخه جدید مدلهای خود انجام دهید.
- بهینهسازی عملکرد: یک نگاشت سفارشی به شما امکان میدهد کد بهینهسازی عملکرد را در انواع خود بنویسید و کنترل کنید که کدام ویژگیها نقشهبرداری میشوند، در نتیجه سربار غیرضروری را کاهش داده و عملکرد را بهبود میبخشد. علاوه بر این، میتوانید کد سفارشی برای فشردهسازی یا از حالت فشردهکردن دادهها بنویسید، در نتیجه پهنای باند شبکه را کاهش داده و عملکرد را بهبود میبخشید.
- پردازش اختصاصی دامنه: یک نقشهبردار سفارشی همچنین به شما امکان میدهد برای قوانین خاص دامنه و تغییرات در انواع خود کد بنویسید. برای مثال، ممکن است لازم باشد عملیات تجاری خاصی را انجام دهید، قوانین تجاری خاصی را اجرا کنید، یا تبدیل داده هایی را انجام دهید که مختص دامنه برنامه شما هستند. در چنین مواردی، میتوانید از یک نگاشت شی سفارشی برای گنجاندن کد برای قوانین خاص دامنه، تبدیل دادهها و تبدیلها استفاده کنید.
نمونه نگاشت شی سفارشی در سی شارپ
اکنون اجازه دهید کمی کد را بررسی کنیم. دو کلاس زیر را در نظر بگیرید.
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; } }
فهرست کد زیر یک نگاشت شی سفارشی را پیاده سازی می کند که یک شی مبدا را به یک شی مقصد نگاشت می کند.
public class CustomObjectMapper { public TDestination Map<TSource, TDestination>(TSource sourceObject) { var destinationObject = Activator.CreateInstance<TDestination>(); if (sourceObject != null) { foreach (var sourceProperty in typeof(TSource).GetProperties()) { var destinationProperty = typeof(TDestination).GetProperty (sourceProperty.Name); if (destinationProperty != null) { destinationProperty.SetValue (destinationObject, sourceProperty.GetValue(sourceObject)); } } } return destinationObject; } }
برای استفاده از نگاشت سفارشی می توانید از قطعه کد زیر استفاده کنید. توجه داشته باشید که چگونه از روش نقشه عمومی برای نگاشت نمونه ای از نوع AuthorModel به نمونه ای از AuthorDTO استفاده شده است.
var source = new AuthorModel(); source.Id = 1; source.FirstName = "Joydip"; source.LastName = "Kanjilal"; source.Address = "Hyderabad, India"; CustomObjectMapper mapper = new CustomObjectMapper(); var destination = mapper.Map<AuthorModel, AuthorDTO>(source); Console.WriteLine("Id = {0}, First Name = {1} Last Name = {2} Address = {3}", destination.Id, destination.FirstName, destination.LastName, destination.Address); Console.ReadLine();
از یک شیء نگاشت سفارشی در متدهای عمل در سی شارپ استفاده کنید
در این بخش، نحوه استفاده از نگاشت سفارشی خود را در متدهای اقدام بررسی خواهیم کرد. ابتدا یک رابط به نام IAuthorRepository ایجاد کنید و کد زیر را وارد کنید.
public interface IAuthorRepository { public AuthorDTO GetAuthor(int id); }
کلاس AuthorRepository این رابط را پیاده سازی خواهد کرد. بنابراین، یک کلاس جدید به نام AuthorRepository ایجاد کنید و کد زیر را در آنجا بنویسید.
public class AuthorRepository : IAuthorRepository { private readonly CustomObjectMapper _customObjectMapper; public AuthorRepository(CustomObjectMapper customObjectMapper) { _customObjectMapper = customObjectMapper; } public AuthorDTO GetAuthor(int id) { var sourceObject = GetAuthorInstance(id); var destinationObject = _customObjectMapper.Map<AuthorModel, AuthorDTO>(sourceObject); return destinationObject; } }
اکنون، کلاس دیگری به نام AuthorController ایجاد کنید و کد تولید شده خودکار را با لیست کد زیر جایگزین کنید.
public class AuthorController : ControllerBase { private readonly IAuthorRepository _authorRepository; public AuthorController(IAuthorRepository authorRepository) { _authorRepository = authorRepository; } public IActionResult GetAuthor(int id) { var author = _authorRepository.GetAuthor(id); //Write your code here based on specific business rules return Ok(author); } }
توجه داشته باشید که در هر دوی این کلاس ها از تزریق وابستگی برای تزریق وابستگی در سازنده ها استفاده شده است. کلاس AuthorRepository همه تماسهای نگاشت سفارشی را کپسوله میکند. به همین دلیل است که ما هیچ کدی برای دسترسی یا استفاده از نگاشت سفارشی در کلاس AuthorController ننوشته ایم.
کلاس AuthorController با استفاده از نمونه ای از AuthorRepository داده ها را از پایگاه داده بازیابی می کند، یعنی نیازی به تعامل مستقیم با پایگاه داده ندارد. به عبارت دیگر، روشهای عمل کنترلر شما نباید حاوی کدی برای انجام مستقیم عملیات CRUD در پایگاه داده باشد.
نگاشت شی همیشه آسان نیست
استفاده از یک نقشهنگار شی سفارشی به شما امکان میدهد پایههای کد تمیزتر و قابل نگهداری ایجاد کنید و دسترسی و انتقال داده را سادهتر کنید. با استفاده از انعطافپذیری و کارایی نقشهبردارهای شی سفارشی، میتوانید راهحلهایی بسازید که حاوی منطق نقشهبرداری متناسب با نیازهای خاص شما باشد.
گفته شد، اگر نقشه برداری بی اهمیت است، می توانید از استفاده از یک نگاشت شی سفارشی اجتناب کنید، زیرا انجام نگاشت بدون آن آسان تر خواهد بود. نکته اصلی این است که شما الگوها و رویکردهای طراحی زیادی برای انتخاب دارید. در صورت امکان از AutoMapper استفاده کنید و در صورت نیاز از نقشهبرداران سفارشی استفاده کنید.
پست های مرتبط
نحوه پیاده سازی یک شی نگاشت سفارشی در سی شارپ
نحوه پیاده سازی یک شی نگاشت سفارشی در سی شارپ
نحوه پیاده سازی یک شی نگاشت سفارشی در سی شارپ