我目前正在使用Automapper将域模型映射到DTO。在我的内心
域模型我有3个bool属性(IsHomeownerIsTenantIsLivingWithParents),这些属性用于设置属性的值
在ViewModel内部,即PersonDTO称为LivingStatus

但是,要获得最终结果,我必须遍历Person模型,创建Dictionary
存储我的值,然后使用AfterMap创建一个嵌套循环并在其中设置值。

尽管它可以工作,但不是理想的解决方案,因为随着数据的增加,它更有可能造成内存泄漏
在尺寸方面。

所以想知道AutoMapper中是否有什么可以避免这种情况?

这是我的代码

查看模型

public class PersonDTO{
  public int Id { get; set; }
  public string FirstName { get; set; }
  public string Surname { get; set; }
  public Status LivingStatus { get; set; }
}


领域模型

public class Person{
   public int Id { get; set; }
   public string FirstName { get; set; }
   public string Surname { get; set; }
   public bool IsHomeOwner { get; set; }
   public bool IsTenant { get; set; }
   public bool IsLivingWithParents { get; set; }
}

public enum Status{
   Homeowner=1,
   Tenant=2,
   LivingWithParents=3
}


public List<PersonDTO> GetEmployee(List<Person> persons)
{
   var livingStatus = new Dictionary<int, Status>();
   foreach (var person in persons)
   {
       if (person.IsHomeOwner)
       {
          livingStatus.Add(person.Id, Status.Homeowner);
       }
       else if (person.IsTenant)
       {
          livingStatus.Add(person.Id, Status.Tenant);
       }
       else
       {
          livingStatus.Add(person.Id, Status.LivingWithParents);
       }
   }

   return _mapper.Map<List<Person>, List<PersonDTO>>(persons, opts => opts.AfterMap((src, dest) {
   foreach(var person in dest)
   {
     person.LivingStatus = livingStatus.Single(x => x.Key == person.Id).Value;
   }
   }));
}

最佳答案

最后找到一个更好的解决方案,方法是创建一个Method来处理转换,然后在映射配置中使用它:)

private Status TypeConverter(Person person)
{
    if (person.IsHomeOwner)
    {
      return Status.Homeowner;
    }
    else if (person.IsTenant)
    {
      return Status.Tenant;
    }
    else
    {
      return Status.LivingWithParents;
    }

    return person.Status;
}


映射配置

CreateMap<Person, PersonDTO>()
                .ForMember(dest => dest.LivingStatus, opt => opt.MapFrom(src => TypeConverter(src)));

关于c# - AutoMapper避免嵌套循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56854446/

10-16 20:09