Как использовать AutoMapper для назначения ссылки на основе значения ключа? - PullRequest
2 голосов
/ 11 мая 2011

Мой вариант использования прост. У меня есть объект корневого домена, который ссылается на дочерний объект. У меня есть 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.Child для существующего экземпляра ChildObject из кэша, используя свойство DTO.ChildKey. Требуется ли для этого пользовательский преобразователь значений или есть другой способ сделать это?

1 Ответ

1 голос
/ 13 мая 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...