如何将相同的复杂类型用作多种输出类型但属性不同的属性

时间:2018-03-26 13:54:02

标签: automapper

我有一个CountryAndCity课程:

public class CountryAndCity
{

    public Country Country { get; set; }

    public City City { get; set; }

    public ZipCode ZipCode { get; set; }

}

我在几个输出类中使用此类,例如:

public class OutputClassA
{
    public CountryAndCity CountryAndCity { get; set; }
}

public class OutputClassB
{
    public CountryAndCity CountryAndCity { get; set; }
}

此外,我有一些“输入类”,其中包含与其他其他字段映射相同的相关字段:

public class InputClassA : ICountryAndCity
{
    ...Some other properties.....

    public int? CountryId { get; set; }
    public string CountryDesc { get; set; }
    public int? CityId { get; set; }
    public string CityDesc { get; set; }

    ...Some other properties.....
}

public class InputClassB : ICountryAndCity
{
    ...Some other properties.....

    public int? CountryId { get; set; }
    public string CountryDesc { get; set; }
    public int? CityId { get; set; }
    public string CityDesc { get; set; }

    ...Some other properties.....
}

我不想为每个输入和输出组合类型的CountryAndCity属性映射复制每个CreateMap语句的代码,所以我决定使用所有“输入类型”实现的接口。

我创建了这个配置,如果我在所有相关的“输入类”上实现ICountryAndCity并使用“Mapper.Map”作为CreateMap函数内的接口,它的工作效果很好。

     Mapper.Initialize(cfg =>
        {

         cfg.CreateMap<InputClassA, OutputClassA>()
                 .ForMember(dest => dest.CountryAndCity,
                    opts => opts.MapFrom(src => Mapper.Map<ICountryAndCity, CountryAndCity>((ICountryAndCity)src)));           

         cfg.CreateMap<InputClassB, OutputClassB>()
                 .ForMember(dest => dest.CountryAndCity,
                    opts => opts.MapFrom(src => Mapper.Map<ICountryAndCity, CountryAndCity>((ICountryAndCity)src)));           



         cfg.CreateMap<ICountryAndCity, CountryAndCity>()
                     .ForMember(dest => dest.Country,
                        opts => opts.MapFrom(
                           src => new Country
                           {
                               CountryId = src.CountryId,
                               CountryDesc = src.CountryDesc
                           }))
                    .ForMember(dest => dest.City,
                        opts => opts.MapFrom(
                           src => new City
                           {
                               CityId = src.CityId,
                               CityDesc = src.CityDesc
                           }))
                        .ForMember(dest => dest.ZipCode,
                        opts => opts.MapFrom(
                           src => new ZipCode
                           {
                               ZipCodeId = src.ZipCodeId,
                               ZipCodeDesc = src.ZipCodeDesc
                           }));
    }

我确信在不使用界面的情况下使用AutoMapper还有其他更好的方法。有人可以帮忙吗?

0 个答案:

没有答案