AutoMapper - как выбрать не выполнять «внутренние» карты? - PullRequest
2 голосов
/ 12 декабря 2011

У меня странный случай, и я довольно новичок в AutoMapper, и я не могу понять, что происходит.

У меня есть два класса

public class Person
{
    public List<Friend> Friends {get;set;}
}

public class PersonView : Person
{
    public new List<FriendView> Friends {get;set;}
}

и карта

Mapper.CreateMap<Person, PersonView>().ForMember(d => d.Friends,
    o => o.ResolveUsing<FriendViewResolver>().FromMember(s => s.Friends));

но у меня также есть эта карта, которая имеет свое отображение:

Mapper.CreateMap<Friend, FriendView>().ForMember(/* a lot of stuff */);

Теперь внутри FriendViewResolver - я звоню Mapper.Map<Friend, FriendView>() каждому из друзей. Но по какой-то причине после запуска некоторые свойства теряются, и после перешагивания кода кажется, что AutoMapper делает второй проход по списку.

Я хочу, чтобы FriendViewResolver выполнялся в списке, потому что он выполняет рекурсивные действия со всей коллекцией Friends, но я не понимаю, почему AM делает второй проход, если есть правило решателя для член.

Я действительно надеюсь, что это имеет смысл.

РЕДАКТИРОВАТЬ: проблема возникает, когда я запускаю Mapper.Map<Person, PersonView>();, я вижу, что он запускает FriendViewResolver и имеет правильный результат, но следующий шаг в отладчике снова запускает карты и портит уже отображенные объекты.

Ответы [ 2 ]

4 голосов
/ 12 декабря 2011

PersonView происходит от Person. Это не то, как AutoMapper должен использоваться. Он должен использоваться для отображения между различными классами. То, что вы пытаетесь сделать здесь, это то, что у вас есть модель домена Person, и вы пытаетесь создать модель представления PersonView, которая будет использоваться в представлениях. Это хорошо и именно то, что вы должны делать, за исключением того, что модель представления не должна быть производной от модели предметной области. Это независимо. Затем вы используете AutoMapper для сопоставления между ними.

Итак, ваш класс PersonView должен выглядеть следующим образом:

public class PersonView
{
    public List<FriendView> Friends {get;set;}
}

и теперь у вас будет 2 определения сопоставления:

Mapper.CreateMap<Friend, FriendView>();
Mapper.CreateMap<Person, PersonView>();

и когда у вас есть экземпляр модели вашего домена (Person), вы сможете отобразить модель представления (PersonView).

0 голосов
/ 12 декабря 2011

Я думаю, вы можете обойтись этим:

Mapper.CreateMap<Person, PersonView>();
Mapper.CreateMap<Friend, FriendView>().ForMember(/* a lot of stuff */);

Карта <Person, PersonView> должна автоматически пытаться сопоставить свойства друзей, поскольку они имеют одинаковые имена. Карта <Friend, FriendView> должна заботиться о фактическом сопоставлении свойств.

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