我目前正在使用Automapper将域模型映射到DTO。在我的内心
域模型我有3个bool属性(IsHomeowner
,IsTenant
,IsLivingWithParents
),这些属性用于设置属性的值
在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/