我一直在尝试使用 AutoMapper 来节省从我的 DTO 到我的域对象的一些时间,但是我在配置映射以使其工作时遇到了问题,我开始怀疑 AutoMapper 是否可能是错误的工具。
考虑这个领域对象的例子(一个实体和一个值):
public class Person
{
public string Name { get; set; }
public StreetAddress Address { get; set; }
}
public class StreetAddress
{
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
}
我的 DTO(来自 Linq-to-SQL 对象)大致如下所示:
public class PersonDTO
{
public string Name { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
}
我希望能够在我的存储库中执行此操作:
return Mapper.Map<PersonDTO, Person>(result);
我已尝试以我能想到的所有方式配置 AutoMapper,但我一直收到通用的缺少类型映射配置或不支持的映射错误,没有详细信息告诉我哪里失败了。
我已经尝试了许多不同的配置,但这里有一些:
Mapper.CreateMap<PersonDTO, Person>()
.ForMember(dest => dest.Address, opt => opt.MapFrom(Mapper.Map<Person, Domain.StreetAddress>));
和
Mapper.CreateMap<Person, Domain.Person>()
.ForMember(dest => dest.Address.Address1, opt => opt.MapFrom(src => src.Address))
.ForMember(dest => dest.Address.City, opt => opt.MapFrom(src => src.City))
.ForMember(dest => dest.Address.State, opt => opt.MapFrom(src => src.State));
我听说使用 AutoMapper 展平对象很容易,但是展开它们并不容易......甚至不可能。谁能告诉我我是否在尝试做不可能的事情,如果不是,我做错了什么?
请注意,我的实际对象有点复杂,所以我可能遗漏了导致错误的关键信息...如果我所做的看起来正确,我可以提供更多信息或开始简化我的测试对象。</p>
最佳答案
这似乎也适用于我:
Mapper.CreateMap<PersonDto, Address>();
Mapper.CreateMap<PersonDto, Person>()
.ForMember(dest => dest.Address, opt => opt.MapFrom( src => src )));
基本上,创建从 dto 到两个对象的映射,然后将其用作子对象的源。
关于mapping - 使用 AutoMapper 展开 DTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8159186/