ورود

View Full Version : حرفه ای: آمورش استفاده از AutoMapper در Asp MVC Core



میلاد رئیسی
پنج شنبه 05 مرداد 1396, 08:31 صبح
AutoMapper کتابخانه ای ساده و سبک برای نگاشت اطلاعات یک شی به شی دیگر به صورت خودکار هست و...
فرض کنید Model ما
public class User
{
public int Id { get; set; }

public string FirstName { get; set; }

public string LastName { get; set; }

public string UserName { get; set; }

public string Password { get; set; }

public bool IsAdmin { get; set; }

public virtual ICollection<BlogPost> BlogPosts { get; set; }
}

و ViewModel ما

public class UserViewModel
{
public string FirstName { get; set; }

public string LastName { get; set; }

public string Password { get; set; }
}

باشه(توجه کنید در واقع من برای View ی مورد نظرم فقط به نام , نام خانوادگی و پسورد نیاز دارم)
برای استفاده UserViewModel بعنوان Model در View ی مورد نظر باید شی UserViewModel رو با اطلاعات شی User مقدار دهی کنیم مثلا با کدی مثل این در کنترلر.
public ActionResult Index(int id = 1)
{
var user = _userService.GetById(id);
var userViewModel = new UserViewModel
{
FirstName = user.FirstName,
LastName = user.LastName,
Password = user.Password
};

return View(userViewModel);
}

رهایی از نوشتن اینجور کدهای تکراری و خسته کننده باعث پیدایش AutoMapper شد...
برای استفاده از AutoMapper از نوگت استفاده میکنیم.

آدرس نوگت (https://www.nuget.org/packages/AutoMapper/)

PM > Install-Package AutoMapper




و
آدرس نوگت (https://www.nuget.org/packages/AutoMapper.Extensions.Microsoft.DependencyInjectio n/)



PM > Install-Package AutoMapper.Extensions.Microsoft.DependencyInjectio n -Version 2.0.1


بعد از نصب این دو پکیچ نوبت به فراخوانی Automapper در کلاس Startup برنامه asp core می رسه :


public void ConfigureServices(IServiceCollection services) {

services.AddMvc();
services.AddAutoMapper();
}


حالا نوبت به ساخت کلاسی که این نگاشت ها رو برای ما انجام بده میرسه که در روت پروژه خودتون باید بسازید . به طور مثال من این کلاس رو با عنوان MappingProfile.cs میسازم و از
Profile مشتق می کنم :


public class MappingProfile : Profile {
public MappingProfile() {
// Add as many of these lines as you need to map your objects
CreateMap<User, UserViewModel>();

}
}

روش استفاده در برنامه هم به شکل زیر می باشد :

public class UserController : Controller {


private readonly IMapper _mapper;


public UserController(IMapper mapper) {
_mapper = mapper;
}

public async Task<IActionResult> Edit(string id) {


var user = await _context.Users
.SingleOrDefaultAsync(u => u.Id == id);


var model = _mapper.Map<User, UserViewModel>(user);


}
}

همنطور که میبنید با نوشتن چندین خط کد عملیات نگاشت اطلاعات یک شی به شی دیگه انجام شد.

RIG000
جمعه 06 مرداد 1396, 11:43 صبح
برای کارکرد درست پروژه و کد نویسی اصولی دقیقا باید از راه های اصولیبهره گرفت. در حال حاضر من هم در تهیه یک پترن که از ساختار اصلی Domain Deriven Design بهره میگیره هستم. البته بحث
Mapping رو از AutoMapper استفاده نکردم. بلکه در فریم ورکی که دارم ایجاد میکنم پیاده سازیش کردم .که عملا دستم باز تر هستش. یه همچین ساختاری میشه



namespace ApplicationServiceTest.ApplicationService
{
public class PersonApplicationService : BaseApplicationService<Person, PersonDto, IPersonService>, IPersonApplicationService
{

public PersonApplicationService(IPersonService baseService, IUnitOfWork unitOfwork, IEntityMapper<Person, PersonDto> mapper) : base(baseService, unitOfwork, mapper)
{
}


public IList<PersonDto> GetAllDto()
{
var res = BaseService.GetAll();
IList<PersonDto> lst = new List<PersonDto>();
//Sample 1
res.ToList().ForEach(item => { lst.Add(item: Mapper.MapTo(item)); });






//Sample 2
//foreach (var item in res.ToList())
//{
// lst.Add(item: Mapper.MapTo(item));
//}
return res.Select(s => Mapper.MapTo(s)).ToList();
}
}
}



و در کهاین کد بالا از IEntityMapper بهره میگره که در Base دیدمش. و در نهایت فضای داخلی Mapper جهت ایجاد و و حذف وویرایش از CreatForm و برای بازگردانی اطلاعات از دامین به Dto از MapTo استفاده میکنه



using ApplicationServiceTest.DomainDto;using DomainModelTest;
using Jir.ApplicationServices.EntityMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ApplicationServiceTest.ApplicationService
{
public class PersonMapper : IEntityMapper<Person, PersonDto>
{
private PersonDto objPerson;
public Person CreateFrom(PersonDto destination)
{
return new Person(destination.Id, destination.UserId, destination.Name, destination.Family);
}

public PersonDto MapTo(Person source)
{
objPerson = new PersonDto();

if (objPerson != null)
{
objPerson.Id = source.ID;
objPerson.UserId = source.UserID;
objPerson.Name = source.Name;
objPerson.Family = source.Family;
}
return objPerson; // return a null objcet from any instance
}
}
}