使用 AutoMapper 展开 DTO

2024-05-14

我一直在尝试使用 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>));

and

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 对象很容易,但是不平整它们并不容易……甚至不可能。谁能告诉我我是否在尝试做不可能的事,如果不是,我做错了什么?

请注意,我的实际对象有点复杂,因此我可能会遗漏错误的关键信息...如果我正在做的事情看起来正确,我可以提供更多信息或开始简化我的对象以进行测试。


这似乎也对我有用:

Mapper.CreateMap<PersonDto, Address>();
Mapper.CreateMap<PersonDto, Person>()
        .ForMember(dest => dest.Address, opt => opt.MapFrom( src => src )));

基本上,创建从 dto 到两个对象的映射,然后将其用作子对象的源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 AutoMapper 展开 DTO 的相关文章