使用带有DI服务的Func进行自动映射以解析值

时间:2016-05-06 21:38:18

标签: c# automapper

我对AutoMapper的当前配置使用enter image description here依赖关系解析来解析服务。解决服务的对象对于问题的重点并不重要,但是解决服务的事实是。

var mapper = new MapperConfiguration((cfg) =>
{
  cfg.ConstructServicesUsing(type => DependencyResolver.GetService(type);

  // mappings...
});

目前我正在使用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的模式?

0 个答案:

没有答案