استفاده از AutoMapper در ASP.NET Core
پنجشنبه 16 آذر 1396در این مقاله قصد داریم با نمونه کدهایی از mvc در مورد سرویس های ارائه شده ی آن صحبت نماییم یکی از این سرویس ها Auto mapper است که می خواهیم نمونه کدهای آن را بررسی نماییم.
تا حالا شاید براتون پیش نیامده باشه که از 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 بود و مثال ها و سرویس های بیشتری وجود دارد
- ASP.net
- 4k بازدید
- 2 تشکر