gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:01:16 25 4
gpt4 key购买 nike

我正在尝试使用 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);

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

最佳答案

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

我的 View 有 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;
}
}
}

在我的通用 View 中,我有这样的 mappingEngine 属性:

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

return _mappingEngine;
}
}

最后在我的通用 View 构造函数中我有:

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

这就是我做 map 的方式: result = items.Project(mappingEngine).To<R>();或者 logic.Update(mappingEngine.Map<S>(wsItem));

因为每个 View 使用 1 个实体,所以我可以为每个实体定义自定义映射配置。希望这有帮助

关于c# - AutoMapper 无法识别特定于配置文件的前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21240231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com