Да, вам понадобится пользовательский преобразователь значений. Что-то вроде этого сделает это:
public class KeyToChildObjectResolver : ValueResolver<Int32, ChildObject>
{
protected override ChildObject ResolveCore(Int32 source)
{
return Cache.Get<ChildObject>(source);
}
}
А потом:
Mapper.CreateMap<DTO, DomainObject>()
.ForMember(x => x.Child, o => o.ResolveUsing<KeyToChildObjectResolver>()
.FromMember(x => x.ChildKey));
Вы можете сделать это с помощью Resolver, который идет прямо из DTO в ChildObject, но тогда ваш распознаватель, по сути, имеет одну цель. Таким образом, вы можете использовать его в любом месте, где у вас есть дочерний ключ для сопоставления с ChildObject