AutoMapper не распознает специфичные для профиля префиксы

Я пытаюсь использовать AutoMapper, чтобы взять данные из класса, который имеет префиксы перед именами свойств, и сопоставить его со вторым классом, который не имеет этих префиксов. Однако я не хочу, чтобы он всегда удалял этот префикс: я просто хочу, чтобы он делал это для этого конкретного отображения.

Мой исходный класс выглядит так:

public class AdvancedSearchFilterDataModel
{
    // ....

    public string ServiceMeterNumber { get; set; }

    // ....
}

Мой целевой класс выглядит так:

[DataContract]
public class ServicesAdvancedSearchFilterData : AdvancedSearchFilterData
{
    // ....

    [DataMember]
    public string MeterNumber { get; set; }

    // ....
}

Когда я пытаюсь отобразить значения, как это, это работает:

Mapper.Configuration.RecognizePrefixes("Service");
Mapper.CreateMap<AdvancedSearchFilterDataModel, ServicesAdvancedSearchFilterData>();
ServicesAdvancedSearchFilterData servciesFilterData = 
    Mapper.Map<ServicesAdvancedSearchFilterData>(model);

Но я хочу, чтобы "Служба" распознавалась как префикс для определенных сопоставлений, поскольку она также используется как обычная часть имен свойств в других сопоставлениях. Я попытался обработать это с помощью профиля, но это не сработало - данные не были сопоставлены:

Mapper.CreateProfile("ServicePrefix").RecognizePrefixes("Service");
Mapper.CreateMap<AdvancedSearchFilterDataModel, ServicesAdvancedSearchFilterData>()
    .WithProfile("ServicePrefix");
ServicesAdvancedSearchFilterData servciesFilterData = 
    Mapper.Map<ServicesAdvancedSearchFilterData>(model);

Как я могу заставить его распознавать префикс только тогда, когда я этого хочу, используя профили или какую-то другую технику? (У меня также есть другие префиксы, которые мне понадобятся для распознавания других сопоставлений таким же образом.)

1 ответ

Решение

Я достиг этой функциональности, создав следующую структуру:

У меня есть модель Person для моего вида, которая сплющена от PersonCombined

public class PersonCombined
{
    public Person Person { get; set; }
    public Address DefaultAddress { get; set; }
    public Contact EmailContact { get; set; }
    public Contact PhoneContact { get; set; }
    public Contact WebsiteContact { get; set; }
}

public class Person : IWebServiceModel
{
    public int ID { get; set; }

    public string PersonFirstName { get; set; }
    public string PersonSurname { get; set; }
    public string PersonDescription { get; set; }
    public Nullable<bool> PersonIsActive { get; set; }
}

Тогда у меня есть отдельный класс для этого отображения только, что выглядит так:

public class PersonCustomMapping : ICustomMapping
{
    const string separator = " ";

    private static IMappingEngine _MappingEngine;
    public IMappingEngine MappingEngine
    {
        get
        {
            if (_MappingEngine == null)
            {
                var configuration = new ConfigurationStore(new TypeMapFactory(), AutoMapper.Mappers.MapperRegistry.Mappers);
                configuration.RecognizePrefixes("Person");
                configuration.RecognizeDestinationPrefixes("Person");

                configuration.CreateMap<Person, MCIACRM.Model.Combine.PersonCombined>();
                configuration.CreateMap<MCIACRM.Model.Combine.PersonCombined, Person>();


                _MappingEngine = new MappingEngine(configuration);
            }

            return _MappingEngine;
        }
    }
}

В моем общем виде у меня есть свойство mappingEngine, как это:

    private IMappingEngine mappingEngine
    {
        get
        {
            if (_mappingEngine == null)
            {
                _mappingEngine = AutoMapper.Mapper.Engine;
            }

            return _mappingEngine;
        }
    }

Наконец, в моем конструкторе общего вида у меня есть:

    public GenericEntityController(IGenericLogic<S> logic, ICustomMapping customMapping)
        : base()
    {
        this._mappingEngine = customMapping.MappingEngine;
        this.logic = logic;
    }

И вот как я делаю картографию:result = items.Project(mappingEngine).To<R>();или жеlogic.Update(mappingEngine.Map<S>(wsItem));

Поскольку я использую 1 объект для каждого представления, я могу определить индивидуальную конфигурацию отображения для каждого объекта. Надеюсь это поможет

Другие вопросы по тегам