使用AutoMapper解开DTO

我一直试图使用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到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,但我不断得到通用的Missing类型映射配置或不支持的映射错误,但没有详细信息告诉我我失败的位置。

我尝试了许多不同的配置,但这里有几个:

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平坦化对象很容易,但解开它们并不容易...甚至可能。 任何人都可以告诉我,我是否正在尝试做不可能的事情,如果不是我做错了什么?

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


使用https://github.com/omuleanu/ValueInjecter,它可以展平和 解压 ,还有其他你需要的东西, 在下载的时候会有一个asp.net mvc示例应用程序,其中展示了所有的功能(也包括单元测试)


这似乎也适用于我:

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

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


无法发表评论,所以发布答案。 我想在AutoMapper实现中有一些变化,因此HansoS提出的回答https://stackoverflow.com/a/5154321/2164198不再可编译。 虽然在这种情况下可以使用另一种方法 - ResolveUsing

Mapper.CreateMap<Person, Domain.Person>()
    .ForMember(dest => dest.Address, opt => opt.ResolveUsing( src => { return new Address() {Address1 = src.Address, City = src.City, State = src.State }; }))
链接地址: http://www.djcxy.com/p/37345.html

上一篇: Using AutoMapper to unflatten a DTO

下一篇: why does angular 2 provider {useValue: ...} clone objects?