如何使用AutoMapper

text
阅读 43 收藏 0 点赞 0 评论 0

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

评论列表


问题


面经


文章

微信
公众号

扫码关注公众号