Automapper - 如何实现查找

Automapper - How to implement a lookup

我有一些遗留代码。此代码将一种地址类型映射到另一种地址类型。例如,我有一个如下所示的语句:

CreateMap<SourceAddress, DestinationAddress>()
  .ForMember(a => a.State, opt => opt.MapFrom(a => a.State.Name));

以上代码有效。然而,基础 API(即 SourceAddress)已经改变。在更新的 API 中,State 属性 不再存在。相反,有一个 StateId 属性。但是,我仍然需要将状态名称映射到 DestinationAddress.

中的 属性

我的问题是,有没有办法在 AutoMapper 的映射语句中实现查找?

更新:包括原始 SourceAddress 模型、更新的 SourceAddress 模型和 DestinationAddress 模型

SourceAddress (original)
------------------------
Id
State (object)
City (string)

SourceAddress (modified)
------------------------
Id
StateId (int)
City (string)

DestinationAddress
------------------
Id
State (string)
City (string)

我的目标是将 SourceAddress 对象中的状态名称映射到 DestinationAddress 对象中的 State 属性。不知何故,我需要使用 StateId 值进行查找(即,根据 StateId 值从 State 对象获取状态名称)。

尝试使用转换器。 状态列表可以通过依赖注入来检索,因为它们不会经常改变,而且你不会每次都从数据库中select这个列表。

public class Converter : ITypeConverter<SourceAddress, DestinationAddress>
{
    private readonly IList<State> _states;

    public Converter (IList<State> states)
    {        
        _states = states;
    }
    public DestinationAddress Convert(SourceAddress source, DestinationAddress destination, ResolutionContext context)
    {
        destination.State = _states.Single(x => x.Id == source.StateId).Name;
        return destination;
    }
}

并使用转换器创建映射

CreateMap<SourceAddress, DestinationAddress>()
  .ForMember(a => a.State, opt => opt.MapFrom<Converter>());

https://docs.automapper.org/en/stable/Custom-type-converters.html