我有一个对象
public class Tenant : EntityBase
{
public virtual string Name { get; set; }
public virtual string Description { get; set; }
public virtual string CreatorName { get; set; }
public virtual TenantState State { get; set; }
public virtual Address Address { get; set; }
public virtual IList<TenantActivity> Activities { get; set; }
public virtual IList<AppUser> Users { get; set; }
public virtual IList<TenantConfig> TenantConfigs { get; set; }
....
}
像这样的DTO:
public class TenantDto
{
public Guid Id { get; set; }
public DateTime CDate { get; set; }
public string CUser { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string CreatorName { get; set; }
public TenantState State { get; set; }
public AddressDto Address { get; set; }
public List<TenantActivityDto> Activities { get; set; }
public List<AppUserDto> Users { get; set; }
public List<TenantConfigDto> TenantConfigs { get; set; }
....
}
类Address
是一个ValueObject,它也有一个DTO。我使用以下映射(标准,没有特殊配置)
public class TenantMapperProfile : Profile
{
protected override void Configure()
{
CreateMap<Tenant, TenantDto>();
CreateMap<TenantDto, Tenant>();
}
}
public class AddressMapperProfile : Profile
{
protected override void Configure()
{
CreateMap<Address, AddressDto>();
CreateMap<AddressDto, Address>();
}
}
在我的App.xaml.cs中,我有:
var mapperConfig = new MapperConfiguration(cfg =>
{
cfg.AddProfile<TenantMapperProfile>();
cfg.AddProfile<TenantActivityMapperProfile>();
cfg.AddProfile<AppUserMapperProfile>();
cfg.AddProfile<AddressMapperProfile>();
//cfg.ShouldMapProperty = p => p.SetMethod.IsPrivate || p.GetMethod.IsAssembly;
});
Mapper = mapperConfig.CreateMapper();
然后我在这样的服务中称呼它:
public TenantDto CreateTenant(TenantDto tenantDto)
{
tenantDto.CreatorName = creatingUserName;
var tenant = _mapper.Map<Tenant>(tenantDto);
tenant = _tenantManagerService.CreateTenant(tenant);//<-- Screenshot made here
return _mapper.Map<TenantDto>(tenant);
}
第一次调用mapper后,我制作了调试器窗口的截图。如您所见,tenantDto
实例包含Address
对象中的数据,但tenant
对象包含正确映射的自己的数据,但嵌套的Address
对象只有空值!我在这做错了什么?
编辑 - 其他信息
调用mapperConfig.AssertConfigurationIsValid();
会返回一个错误:
Bedisoco.BedInventory.Sys.Models.Entities.Role上的以下属性无法映射: 角色 添加自定义映射表达式,忽略,添加自定义解析程序或修改目标类型Bedisoco.BedInventory.Sys.Models.Entities.Role。
Role
对象位于其中一个列表中,我认为User
集合中的List<AppUser>
对象包含Role
个对象列表。它甚至没有完全实现。
我错了,假设Automapper无声地忽略了这些事情 ??
答案 0 :(得分:3)
好的解决了,这是我自己的问题。
我的大多数值对象都包含一个包含所有字段和私有setter的构造函数。如果配置正确(cfg.ShouldMapProperty = p => p.SetMethod.IsPrivate || p.GetMethod.IsAssembly;
),私有设置器对Automapper没有问题。
但是VS或ReSharper建议使自动属性“只获得”。这个重构令VS高兴,但不是Automapper!