AutoMapper没有识别特定配置文件前缀

3
我将使用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个回答

2
我通过创建以下结构来实现这个功能:
我有一个名为 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个实体,因此我可以为每个实体定义自定义映射配置。 希望这有所帮助。

谢谢。最终我用了不同的方法来实现它,所以无法测试并亲自验证它是否有效,但我会暂时将其标记为“正确”,希望对下一个遇到这个问题的人有所帮助。 - JJS
6
依我拙见,我认为这个解决方案已经达到复杂到让人想骂人的地步。我宁愿手动完成。 - Léon Pelletier
@JJS,你能分享一下你实现它的不同方式吗? - xr280xr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接