我对AutoMapper的当前配置使用依赖关系解析来解析服务。解决服务的对象对于问题的重点并不重要,但是解决服务的事实是。
var mapper = new MapperConfiguration((cfg) =>
{
cfg.ConstructServicesUsing(type => DependencyResolver.GetService(type);
// mappings...
});
目前我正在使用asp.net-mvc和TypeConveters来解析属性,但有时似乎有点过分。例如:
public class CarDO // Data Object
{
public int CarId { get; set; }
public int OwnerId { get; set; }
}
public class CarBO // Business Object
{
public int OwnerId { get; set; }
public string OwnerName { get; set; }
}
public class UsersBL // Business Layer
{
public strung GetName(int userId) { return userNameFromId } // example
}
public class CarBL
{
public CarBO Get(int carId)
{
var carDO = _repositoryDataAccessWhatever.GetCar(carId);
var result = mapper.Map<CarBO>(carDO);
return result;
}
}
通常我必须创建一个完整的对象来解析所有者名称(这是一个不好的例子,因为这将是一个很好的重用候选者,但我们假设它不是。)
public class UserNameResolver : ValueResolver<CarDO, string>
{
private readonly IUserBL _userBL;
public UserNameResolver(IUserBL userBL)
{
_userBl = userBL; // DI by DependencyResolver Configured Above
}
protected override int ResolveCore(CarDO carDO)
{
var result = _userBL.GetUserName(carDO.UserId);
return result;
}
}
然后映射它:
cfg.CreateMap<CarDO, CarBO>()
.ForMember(dest => dest.Name,
opt => opt.ResolveUsing<UserNameResolver >());
对我而言,这似乎是一种矫枉过正。我查看了文档,我希望我错过了一些简单的东西(这显然不起作用):
cfg.CreateMap<CarDO, CarBO>()
.ForMember(dest => dest.Name,
opt => opt.MapFrom<IUserBL>((do, userBL) =>
{
return userBL.GetUserName(do.UserId);
}));
是否有一个扩展方法允许Func使用DI或其他一些不需要TypeConverter或ValueResolver的模式?