استفاده از AutoMapper در ASP.NET Core

در این مقاله قصد داریم با نمونه کدهایی از mvc در مورد سرویس های ارائه شده ی آن صحبت نماییم یکی از این سرویس ها Auto mapper است که می خواهیم نمونه کدهای آن را بررسی نماییم.

استفاده از AutoMapper در ASP.NET Core

تا حالا شاید براتون پیش نیامده باشه که از Automapper در پروژه های Asp.net استفاده نکرده باشید، در بعضی مواقع شاید از json.net  استفاده کرده باشید که در آن فقط از یک بسته ی defacto که در پروژه نصب می شود استفاده می کردید

ولی Automappper از کلاس های استاتیک و تزریق وابستگی استفاده می شود که چهار چوب را برای پروژه های asp.net می توان استفاده کرد

در این مقاله ما می خواهیم استفاده از automapper را در asp.net mvc آموزش دهیم و فرض ما بر این است که شما کمی اطلاعات در مورد آن می دانید

تنظیمات

ابتدا باید در پروژه تان پکیج زیر را نصب نمایید به صورت کد زیر:

 	
Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection

این کد خودش برای شما بسته ها را نصب می کند ولی راه دیگری هم هست که در متد ConfigureServices در کلاس startup.cs صدا بزنید تا سرویس مورد نیاز مانند auto mapper را اضافه کند.

public void ConfigureServices(IServiceCollection services)
{
	services.AddAutoMapper();
	services.AddMvc();
}

اگر می خواهید ببینید که این کد چیست و چگونه صدا زده شده است می توانید از آدرس که در این  لینک است  از مقاله دیدن کنید و ما فقط در اینجا خلاصه ای از آن را آورده ایم در این کد Imapper کلاس های شما را ثبت می کند و مشخص نیست که کلاس ها را در چه حوزه ای ذخیره می کند برای همین به صورت خلاصه توضیح می دهیم.

افزودن Profile

بر روی Automapper Profiles تغغیری ایجاد نشده است ما در اینجا یک مثال می آوریم که کلاس DomainProfile را ایجاد می کنیم تا بتوانیم map ها را اضافه کنیم و در داخل سازنده یک نقشه را راه اندازی کنیم

public class DomainProfile : Profile
{
public DomainProfile()
{
CreateMap<DomainUser, UserViewModel>();
}
}

هنگامی که شما برنامه را اجرا می کنید Automapper از طریق کدهای شما به دنبال کلاسی می گردد که از profile ارث بری کند و تنطیمات آن ها را بار گذاری کند به همین سادگی

استفاده از Imapper

هنگامی که profile را باز می کنید با استفاده از interface imapper  شما می توانید سازنده ی کلاس خود را در Imapper تزریق کنید و سپس می توانید اشیا را از mapper بگیرید

public class HomeController : Controller
{
private readonly IMapper _mapper;
 
public HomeController(IMapper mapper)
{
_mapper = mapper;
}
 
public IActionResult Index()
{
//Do some work here. 
//And when we want to map do something like the following. 
var result = _mapper.Map<TypeIWantToMapTo>(originalObject);
}
}

شما Imapper را در ServiceCollection ایجاد نکردید اما بسته و متد AddAutoMapper را در کلاس ConfigureServices وارد کردیم

یک نکته وجود دارد که شما بتوانید تنظیمات خود را در Automapper کار کنید حالا بیایید این تنظیمات را با هم بررسی نماییم

یکی از تنظیمات این است که در profile automapper از singeltone استفاده شده است این به این معنی است که زمانی که پروژه ی شما در حال اجراست تغییراتی ایجاد نمی شود

Interfact در IMapper محدود است در اصطلاحات asp.net به این معنی است که برای هر درخواست فردی یک Imapper ایجاد می شود اما بعد از آن کل درخواست در برنامه به اشتراک گذاشته می شود بنابراین اگر IMAPper را داخل یک controller و درون یک سرویس برای یک درخواست استفاده کنید، آنها از همان نمونه IMapper استفاده خواهند کرد.

اما آنچه که مهم است هر چیزی از IValueResolver حاصل می شود ITypeConverter یا IMemberValueResolver خواهد بود .علاوه بر آن می توانیم از .NET Core Service استفاده کنیم در کد زیر بر اساس نام کاربری و id می خواهیم به UserRepository دسترسی داشته باشیم.

public class UsernameResolver : IValueResolver<DomainUser, UserViewModel, string>
{
private readonly IUserRepository _userRepository;
 
public UsernameResolver(IUserRepository userRepository)
{
_userRepository = userRepository;
}
 
public string Resolve(DomainUser source, UserViewModel destination, string destMember, ResolutionContext context)
{
return _userRepository.GetById(source.Id).Username;
}
}

این مثالی که زده شد یک نمونه ی گذرا از خدمات asp.net mvc core بود و مثال ها و سرویس های بیشتری وجود دارد