how to use AutoMapper
1. install AutoMapper and AutoMapper.Extensions.Microsoft.DependencyInjection in nuget package manager
2. Create a viewModel, for example:
Create a file of order view model called OrderViewModel.cs
public class OrderViewModel
{
public int OrderId { get; set; }
public DateTime OrderDate { get; set; }
[Required]
[MinLength(4)]
public string OrderNumber { get; set; }
}
3. in Startup.cs, add AutoMapper to ConfigureServices method
services.AddAutoMapper();
4. Create a DutchMappingProfile.cs in Data folder to tell this program how to map from entity to view model
public class DutchMappingProfile:Profile
{
public DutchMappingProfile()
{
CreateMap<Order, OrderViewModel>()
.ForMember(o => o.OrderId, ex => ex.MapFrom(o => o.Id))
.ReverseMap();
}
}
5. in OrdersController,
add IMapper to constructor
private readonly IDutchRepository repository;
private readonly ILogger<OrdersController> logger;
private readonly IMapper mapper;
public OrdersController(IDutchRepository repository,
ILogger<OrdersController> logger,
IMapper mapper)
{
this.repository = repository;
this.logger = logger;
this.mapper = mapper;
}
Map entities to view model in Get and Post method
[HttpGet]
public IActionResult Get()
{
try
{
return Ok(this.mapper.Map<IEnumerable<Order>, IEnumerable<OrderViewModel>>(this.repository.GetAllOrders()));
}
catch (Exception ex)
{
this.logger.LogError($"Fail to get orders: {ex}");
return BadRequest();
}
}
[HttpGet("{id:int}")]
public IActionResult Get(int id) {
try
{
var order = this.repository.GetOrderById(id);
if (order != null) return Ok(this.mapper.Map<Order, OrderViewModel>(order));
else return NotFound();
}
catch (Exception ex)
{
this.logger.LogError($"Fail to get orders: {ex}");
return BadRequest();
}
}
[HttpPost]
public IActionResult Post([FromBody]OrderViewModel model) {
try
{
if (ModelState.IsValid)
{
var newOrder = this.mapper.Map<OrderViewModel, Order>(model);
if (newOrder.OrderDate == DateTime.MinValue) {
newOrder.OrderDate = DateTime.Now;
}
this.repository.AddEntity(newOrder);
if (this.repository.SaveAll())
{
var vm = this.mapper.Map<Order, OrderViewModel>(newOrder);
return Created($"/api/orders/{vm.OrderId}", vm);
}
}
else {
return BadRequest(ModelState);
}
}
catch (Exception ex)
{
this.logger.LogError($"Fail to save a order: {ex}");
}
return BadRequest("Fail to save order");
}
6. Every time if a new entity wants to be mapped to a view model, it has be declared in
DutchMappingProfile.cs
for example, I want to map OrderItem to OrderItemViewModel
add
CreateMap<OrderItem, OrderItemViewModel>()
.ReverseMap()
to DutchMappingProfile.cs