AutoMapper无法识别特定于配置文件的前缀

时间:2014-01-20 17:19:38

标签: c# .net 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);

但我只想将“Service”识别为某些映射的前缀,因为它也被用作其他映射中属性名称的正常部分。我尝试使用配置文件处理此问题,但这不起作用 - 没有映射数据:

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

如何使用配置文件或其他技术,只有在我需要时才能识别前缀? (我还有其他前缀,我需要它以同样的方式识别其他映射。)

1 个答案:

答案 0 :(得分:2)

我通过创建以下结构来实现此功能:

我的观点的人物模型是从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个实体,所以我可以为每个实体定义自定义映射配置。 希望这有帮助