使用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?