در این قسمت به پیکربندی و نصب AutoMapper میپردازیم.قصد داریم از AutoMapper در پروژه های Asp.Net Core 8 همراه با EF Core 9 استفاده کنیم. تصور کنید در حال ساخت یک برنامه پیچیده هستید. دادههای زیادی دارید. که باید از دیتابیس خوانده شوند. و در قسمتهای مختلف برنامه نمایش داده شوند؛ مثلاً یک سیستم مدیریت کاربران. هر کاربر اطلاعات زیادی مثل نام، نام خانوادگی، تاریخ تولد، نقشها و مجوزها دارد. اما در بسیاری از بخشها نیازی به نمایش تمام این اطلاعات نیست. مثلاً در صفحه لیست کاربران، فقط نام، ایمیل و نقش آنها نمایش داده میشود. حالا چطور میتوانید این دادههای پیچیده را به مدلهای سادهتر تبدیل کنید؟
اگر بخواهید این کار را به صورت دستی انجام دهید، مجبورید برای هر مدل یک کد تبدیل بنویسید. این کدها هم طولانی هستند، هم تکراری و احتمال خطا در آنها زیاد است. دقیقاً اینجاست که یک ابزار قدرتمند مثل AutoMapper به کمک شما میآید. AutoMapper مانند یک مترجم حرفهای عمل میکند؛ کافی است به آن بگویید که چگونه دادههای شما از یک مدل به مدل دیگر تبدیل شوند و بقیه کارها را به آن بسپارید. اما مثل هر ابزار دیگری، برای استفاده از آن باید تنظیمات اولیهای انجام دهید. این مرحله همان چیزی است که به آن پیکربندی اولیه و تعریف نقشهبرداریها (Mappings) میگوییم.
AutoMapper ذاتاً هیچ شناختی از مدلهای شما ندارد. اگر بخواهید بین دو مدل، مثلاً مدل کاربر (User) و مدل نمایشی آن (UserDto)، دادهها را منتقل کنید، باید به AutoMapper یاد بدهید که چه ویژگیهایی از مدل مبدا به مدل مقصد مرتبط هستند. این فرآیند پایه و اساس کار با AutoMapper است و اگر به درستی انجام شود، میتواند حجم زیادی از کارهای دستی و خستهکننده شما را حذف کند.
پیکربندی صحیح به شما کمک میکند:
برای شروع کار با AutoMapper، باید چند گام ساده را طی کنیم. در ادامه این گامها را به تفصیل توضیح میدهیم:
اولین گام این است که کتابخانه AutoMapper را به پروژه خود اضافه کنید. این کار را میتوانید با استفاده از NuGet انجام دهید.
Install-Package AutoMapper
Profile یک کلاس ارائهشده توسط AutoMapper است. برای تعریف Mappings ها استفاده میشود. این کلاس کمک میکند Mappings ها سازماندهی شوند و پروژههای بزرگ خواناتر باشند.
مسیر پیشنهادی
Application/Mappings/MappingProfile.cs
نمونه کد تعریف نوع Mapping
public MappingProfile()
{
CreateMap<Manager,ManagerViewModel>().ReverseMap();
}
AutoMapper باید به Dependency Injection (DI) پروژه اضافه شود. این کار را میتوانید در فایل Program.cs انجام دهید.
builder.Services.AddAutoMapper(typeof(MappingProfile));
OR
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
کد AppDomain.CurrentDomain.GetAssemblies تمام اسمبلیهای موجود در دامنه برنامه (Current AppDomain) اسکن میشوند. این یعنی تمام کلاسهایی که از Profile ارثبری کردهاند، بدون توجه به این که در کدام پروژه یا لایه قرار دارند، شناسایی میشوند. برای پروژههای چند لایه که کلاسهای Profile در لایههای مختلف تعریف شده.
کد typeof(Program) فقط اسمبلیای که کلاس Program در آن قرار دارد (معمولاً پروژه اصلی مثل WebAPI یا UI) اسکن میشود. کلاسهای Profile که در این اسمبلی باشند شناسایی و ثبت میشوند. مناسب برای: پروژههای تک لایه یا ساده که تمام پروفایلهای AutoMapper در پروژه اصلی تعریف شدهاند.
private readonly MyDbContext _context;
private readonly IMapper _mapper;
//
public ManagersController(MyDbContext context, IMapper mapper)
{
_context = context;
_mapper = mapper;
}
//
List<ManagerViewModel> managerVm=_mapper.Map<List<ManagerViewModel>>(ManagerM);
//
var managerVm = await _context.managers.AsNoTracking().
ProjectTo<ManagerViewModel>(_mapper.ConfigurationProvider).ToListAsync();
//
var manager = _mapper.Map<Manager>(managerVm);
سلام و خسته نباشید
تو ثبت AutoMapper اگر از نسخه جدید AutoMapper (مثل v15.0.1) استفاده میکنی، باید از delegate استفاده کنی. این کد رو در Program.cs قرار بده:
builder.Services.AddAutoMapper(cfg => ;cfg.AddMaps(typeof(MappingProfile).Assembly))