AutoMapper支持通过创建自定义解析器来解决关联对象映射中的问题。
示例: 假设有两个不同的模型,其中一个包含一个User对象,而另一个则包含User对象的Id。
public class UserDto
{
public int Id { get; set; }
public string Name { get; set; }
}
public class OrderDto
{
public int Id { get; set; }
public string Description { get; set; }
public int UserId { get; set; }
}
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public List Orders { get; set; }
}
public class Order
{
public int Id { get; set; }
public string Description { get; set; }
public User User { get; set; }
}
我们可以通过一个自定义解析器来解决这个问题:
class UserResolver : IValueResolver
{
private readonly DbContext _db;
public UserResolver(DbContext db)
{
_db = db;
}
public User Resolve(OrderDto source, Order destination, User destMember, ResolutionContext context)
{
return _db.Users.FirstOrDefault(u => u.Id == source.UserId);
}
}
然后我们就可以使用这个自定义解析器解决这个问题:
Mapper.Initialize(cfg => cfg.CreateMap()
.ForMember(dest => dest.User, opt => opt.MapFrom()));