mohammad mhammadi
mohammad mhammadi
خواندن ۲ دقیقه·۲ سال پیش

استفاده از auto mapper در asp .net core با استفاده از Boxed.Mapping


  • هدف استفاده از auto mapper جهت map کردن یک object به object دیگری است که عمده استفاده از این قابلیت ، وقتی است که یک مدل در دیتا بیس داریم و میخواهیم برای مثال انرا از دیتابیس query بزنیم و دریافت کنیم ، اما از این جدول ، تمامی فیلد های آنرا لازم نداریم ، پس مجبوریم که تک تک property های آنرا در متد مد نظر بصورت متناظر با مدل دیگمون (dto ) پر کنیم و اینکارو در هر متد جداگانه باید انجام داد ، حال با استفاده از auto mapper میایم و مدل دیتابیس را در مدل dto یکبار با شرایط دلخواه map میکنیم و هر چند بار بخوایم استفاده می کنیم.
  • جهت استفاده از mapper مراحل زیر را باید طی کنیم :

1. ابتدا پکیج Boxed.Mapping را نصب می نماییم

2. سپس در قسمتی از برنامه ( مثلا زیر مجموعه service یک پوشه با نام mapper می سازیم و داخل ان به ازای هر map یک کلاس می سازیم ) در زیر نمونه ای از کلاس مد نظر ساخته شده اورده شده است:

namespace Service.Services.Mapper;

// dar in ja ba estefade az using pakcage made nazaro vared mikonim

using Boxed.Mapping;

using Common.DataBase;

using Models.ViewModels;

using Utility;


public class UserMapper : IMapper<User, UserDto>, IMapper<UserDto, User>

{

public void Map(User source, UserDto destination)

{

ArgumentNullException.ThrowIfNull(source);

ArgumentNullException.ThrowIfNull(destination);


destination.Id = source.Id;

destination.FirstName = source.FirstName;

destination.LastName = source.LastName;

destination.IsDisabled = source.IsDisabled;

destination.UserName = source.UserName;

destination.CreateDate = source.CreateDate;

destination.IsBot = source.IsBot;

destination.PublicKey = source.PublicKey;

destination.FullName = source.FullName;

if (source.Groups is not null)

{

destination.Groups = source.Groups.Select(x => new GroupDto()

{

Description = x.Description,

Id = x.Id,

Name = x.Name,

}).ToList();

}

}


public void Map(UserDto source, User destination)

{

ArgumentNullException.ThrowIfNull(source);

ArgumentNullException.ThrowIfNull(destination);


destination.IsDisabled = source.IsDisabled;

destination.UserName = source.UserName;

destination.FirstName = source.FirstName;

destination.LastName = source.LastName;

destination.IsBot = source.IsBot;

destination.CreateDate = DateTime.UtcNow;

if (source.IsBot && source.Id != null && source.BotPassword != null)

{

destination.AuthPwd = AuthenticationUtils.CreateBotHash(source.Id.Value, source.BotPassword);

}

else

{

destination.AuthPwd = null;

}

}

}

3. و در نهایت کافی است در کلاس program یک service جدید بصورت transiant ایجاد کنیم از کلاس مد نظر مانند زیر:

builder.Services.AddTransient<IMapper<UserDto, User>, UserMapper>()

4. سپس جهت استفاده از این mapper کافی است بصورت dependency injection داخل constructor کلاس مد نظر آنرا injec کنیم

private readonly IMapper<User, UserDto> userToDtoMapper;

5. و در نهایت در متد مد نظر به صورت زیر ازش استفاده می کنیم و میتونیم فقط مدل دیتابیسو به عنوان وروردی بهش بدیم

var result = this.userToDtoMapper.MapList(users);

و در نهایت به عنوان خروجی یک مدل به صورت Dto به ما تحویل میده

net core
شاید از این پست‌ها خوشتان بیاید