2016-04-19 2 views
0

Наконец-то получил automapper для работы: previous question 1, previous question 2.Automapper RecognizePostfix метод не работает с массивом oh postfixes

На данный момент у меня есть что-то вроде этого:

public class Steps 
{ 
    public PersonalModel Personal1 { get; set; } 
    public CompanyModel Company2 { get; set; } 
    public SposeModel Spose3 { get; set; } 
}  
public class PersonalModel 
{ 
    public int Id { get; set; } 
}  
public class CompanyModel 
{ 
    public string Name { get; set; }  
} 
public class SposeModel 
{ 
    public string Age { get; set; }  
} 

И:

public class Content 
{ 
    public string Dummy1 { get; set; } 
    public string Dummy2 { get; set; } 
    public string Dummy3 { get; set; } 
    public string Dummy4 { get; set; } 
    public string Dummy5 { get; set; } 

    public Personal Personal { get; set; } 
    public Company Company { get; set; } 
    public Spose Spose { get; set; } 
}  
public class Personal 
{ 
    public int Id { get; set; } 
}  
public class Company 
{ 
    public string Name { get; set; }  
} 
public class Spose 
{ 
    public string Age { get; set; }  
} 

Эти объекты схематически похожий на моих исходных объектов, за исключением имени и сложности.

И отображение выглядит следующим образом:

public class AutoMapperConfig 
{ 
    public static MapperConfiguration MapperConfiguration { get; set; } 

    public static void Configure() 
    { 
     MapperConfiguration = new MapperConfiguration(cfg => { 
      cfg.AddProfile<Out>(); 
      cfg.CreateMap<Steps, Content>(); 
     }); 
     MapperConfiguration.AssertConfigurationIsValid(); 
    } 
} 

public class Out: Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<PersonalModel, Personal>(); 
     CreateMap<CompanyModel, Company>(); 
     CreateMap<SposeModel, Spose>(); 

     CreateMap<Steps, Content>(); 
     .ForMember(dest => dest.Personal, opt => opt.MapFrom(src => src.Personal1)) 
     .ForMember(dest => dest.Company, opt => opt.MapFrom(src => src.Company2)) 
     .ForMember(dest => dest.Spose, opt => opt.MapFrom(src => src.Spose3)) 
     .ForMember(dest => dest.Dummy1, opt => opt.Ignore()) 
     .ForMember(dest => dest.Dummy2, opt => opt.Ignore()) 
     .ForMember(dest => dest.Dummy3, opt => opt.Ignore()) 
     .ForMember(dest => dest.Dummy4, opt => opt.Ignore()) 
     .ForMember(dest => dest.Dummy5, opt => opt.Ignore()); 
    } 
} 

Я хочу, чтобы оптимизировать отображение (взял его на другой вопрос, чтобы не сделать еще слишком сложным), как и в AutoMapper Configuration Documentation at GitHub, я увидел, RecognizePostfix способ. Но когда я ставлю следующую строку в разделе конфигурации:

cfg.RecognizePostfix(new string[3] {"1", "2", "3"}); 

И удалить следующий из профиля:

.ForMember(dest => dest.Personal, opt => opt.MapFrom(src => src.Personal1)) 
.ForMember(dest => dest.Company, opt => opt.MapFrom(src => src.Company2)) 
.ForMember(dest => dest.Spose, opt => opt.MapFrom(src => src.Spose3)) 

я получаю исключение:

AutoMapper.AutoMapperConfigurationException: неотображённые члены найдено. Просмотрите типы и элементы ниже. Добавить пользовательское выражение отображение , игнорировать, добавить пользовательский распознаватель или изменить тип источника/назначения

Что я здесь делаю неправильно?

ответ

1

На самом деле я не знаю, следует ли это считать ошибкой или как это должно работать, но, видимо, pre/postfixes работает только для профиля, где он был определен.

В вашем случае, вы можете быстро устранить проблему перемещения RecognizePostfixes вызов профиля:

public static void Configure() 
{ 
    MapperConfiguration = new MapperConfiguration(cfg => { 
     cfg.AddProfile<Out>(); 
    }); 
    MapperConfiguration.AssertConfigurationIsValid(); 
} 
... 

И профиль:

public class Out : Profile 
{ 
    protected override void Configure() 
    { 
     RecognizePostfixes("1", "2", "3"); 

     CreateMap<PersonalModel, Personal>(); 
     CreateMap<CompanyModel, Company>(); 
     CreateMap<SposeModel, Spose>(); 

     CreateMap<Steps, Content>() 
      .ForMember(dest => dest.Dummy1, opt => opt.Ignore()) 
      .ForMember(dest => dest.Dummy2, opt => opt.Ignore()) 
      .ForMember(dest => dest.Dummy3, opt => opt.Ignore()) 
      .ForMember(dest => dest.Dummy4, opt => opt.Ignore()) 
      .ForMember(dest => dest.Dummy5, opt => opt.Ignore()); 
    } 
} 
+0

Огромное спасибо, человек! Ты спас меня от сумасшествия! Я просто не понимаю, почему у такого отличного продукта такая плохая документация ... – neoselcev

+1

Да, я искал документы, но ничего не нашел об этом –

+0

Еще раз спасибо за помощь! – neoselcev