Как использовать AutoMapper для назначения ссылки на основе значения ключа?

#automapper

#automapper

Вопрос:

Мой вариант использования прост. У меня есть объект корневого домена, который ссылается на дочерний объект. У меня есть DTO, переданный обратно из вызова службы, который представляет объект домена, но вместо того, чтобы передавать дочерний объект каждый раз, DTO содержит свойство, которое содержит ключевое значение дочернего объекта. Что-то вроде этого:

 public class DomainObject
{
    public ChildObject Child { get; set; }
    public String Name { get; set; }
}

public class ChildObject
{
    public Int32 Key { get; set; }
    public String Name { get; set; }
}

public class DTO
{
    public Int32 ChildKey { get; set; }
    public String Name { get; set; }    
}
  

У меня есть кэшированный список дочерних объектов. Когда я сопоставляю из DTO => DomainObject, я хочу установить DomainObject.Дочернее свойство для существующего экземпляра ChildObject из кэша с использованием DTO.Свойство дочернего ключа. Требуется ли для этого пользовательский преобразователь значений или есть другой способ добиться этого?

Ответ №1:

Да, вам понадобится пользовательский преобразователь значений. Что-то вроде этого сделает это:

 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));
  

Вы могли бы сделать это с помощью преобразователя, который переходит прямо из DTO в ChildObject, но тогда ваш преобразователь, по сути, одноцелевой. Таким образом, вы можете использовать его везде, где у вас есть дочерний ключ, который будет сопоставлен с дочерним объектом