【问题标题】:How to Use AutoMapper to Map to Models With Inheritance and Nested Models如何使用 AutoMapper 映射到具有继承和嵌套模型的模型
【发布时间】:2011-10-31 15:36:56
【问题描述】:

我有一个包含 2 个子类型的地址实体。这是我的简化代码:

public class Address {
    public string Street1 { get; set; }
    public string Country { get; set; }
}
public class UsAddress : Address {
    public string State { get; set; }
}
public class CandianAddress : Address {
    public string Providence { get; set; }
}

这是我的简化视图模型:

public class LocationModel {
    public string Street1 { get; set; }
}
public class UsLocationModel : LocationModel {
    public string State { get; set; }
}
public class CaLocationModel : LocationModel {
    public string Providence { get; set; }
}
public class AddressModel {
    public int? Country { get; set; }
    public UsLocationModel UsLocation { get; set; }
    public CaLocationModel CaLocation { get; set; }
}

这是我简化的 AutoMapper 配置:

Mapper.CreateMap<Address, AddressModel>()
            .Include<UsAddress, AddressModel>()
            .Include<CanadianAddress, AddressModel>();
Mapper.CreateMap<UsAddress, AddressModel>();
Mapper.CreateMap<CanadianAddress, AddressModel>();
Mapper.CreateMap<Address, LocationModel>()
            .Include<UsAddress, USLocationModel>()
            .Include<CanadianAddress, CALocationModel>();
Mapper.CreateMap<UsAddress, USLocationModel>();
Mapper.CreateMap<CanadianAddress, CALocationModel>();

我不知道如何解决AddressModel 上的UsLocationCaLocation 属性...

【问题讨论】:

    标签: entity viewmodel automapper


    【解决方案1】:

    我想通了。这是我的 Automapper 配置的简化版本:

    Mapper.CreateMap<Address, AddressModel>()
        .Include<UsAddress, AddressModel>()
        .Include<CanadianAddress, AddressModel>()
        .ForMember(x => x.USLocation, a => a.Ignore())
        .ForMember(x => x.CALocation, a => a.Ignore())
        .ForMember(x => x.Country, a => a.ResolveUsing<HaveIdValueResolver<Country, int>>().FromMember(x => x.Country);
    Mapper.CreateMap<UsAddress, AddressModel>()
        .ForMember(x => x.USLocation, a => a.MapFrom(Mapper.Map<UsAddress, USLocationModel>))
        .ForMember(x => x.CALocation, a => a.Ignore())
        .ForMember(x => x.Country, a => a.ResolveUsing<HaveIdValueResolver<Country, int>>().FromMember(x => x.Country));
    Mapper.CreateMap<CanadianAddress, AddressModel>()
        .ForMember(x => x.USLocation, a => a.Ignore())
        .ForMember(x => x.CALocation, a => a.MapFrom(Mapper.Map<CanadianAddress, CALocationModel>))
        .ForMember(x => x.Country, a => a.ResolveUsing<HaveIdValueResolver<Country, int>>().FromMember(x => x.Country));
    Mapper.CreateMap<Address, LocationModel>()
        .Include<UsAddress, USLocationModel>()
        .Include<CanadianAddress, CALocationModel>();
    Mapper.CreateMap<UsAddress, USLocationModel>();
    Mapper.CreateMap<CanadianAddress, CALocationModel>();
    

    这是一个简化的示例测试:

    var usAddress = new FakeUsAddress("111 L St", new FakeState(id: 17));
    var addressModel = Mapper.Map<UsAddress, AddressModel>(usAddress);
    Assert.IsNotNull(addressModel.USLocationModel);
    Assert.IsNull(addressModel.CALocationModel);
    Assert.AreEqual(usAddress.Street1, addressModel.USLocationModel.Street1);
    Assert.AreEqual(usAddress.State.Id, addressModel.USLocationModel.State);
    Assert.AreEqual(usAddress.Country.Id, addressModel.USLocationModel.Country);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 2017-06-23
      相关资源
      最近更新 更多