Хотя я относительно новичок в AutoMapper, я использую его в небольшом проекте, который разрабатываю. Раньше у меня никогда не было проблем с его использованием, но теперь я столкнулся с каким-то странным поведением при передаче параметров в Custom Resolver.
Вот сценарий: я получаю список сообщений из своего репозитория, а затем сопоставляю их с удобной для внешнего интерфейса версией. Ничего необычного, просто какое-то сопоставление нормалей между объектами. У меня есть поле в этом внешнем объекте, которое сообщает, проголосовал ли уже определенный пользователь за это сообщение, и именно для этого я использую Custom Resolver (это второй «ForMember»):
public List<SupportMessageUi> GetAllVisible(string userId)
{
Mapper.CreateMap<SupportMessage, SupportMessageUi>()
.ForMember(dest => dest.Votes,
opt => opt.ResolveUsing<SupportMessageVotesResolver>())
.ForMember(dest => dest.UserVoted,
opt => opt.ResolveUsing<SupportMessagesUserVotedResolver>()
.ConstructedBy(() => new SupportMessagesUserVotedResolver(userId)));
var messages = _unitOfWork.MessagesRepository.Get(m => m.Visible);
var messagesUi = Mapper.Map<List<SupportMessageUi>>(messages);
return messagesUi;
}
Я вызываю этот метод для веб-службы, и возникает проблема: при первом вызове веб-службы (используя консоль веб-службы) все работает отлично. Например, если я передам «555» в качестве идентификатора пользователя, я получу этот метод с правильным значением:
И в Custom Resolver значение было правильно передано конструктору:
Возвращаемые результаты верны. Проблема идет дальше. Во второй раз, когда я вызываю службу, передавая другой аргумент (на этот раз «666»), аргумент, который попадает в конструктор Custom Resolver, является старым ('555'). Вот что я имею в виду:
Прямо перед сопоставлением объектов мы видим, что значение, переданное конструктору, было правильным ('666'):
Но когда он попадает в конструктор Resolver, значение неверное и является старым ('555'):
Все последующие вызовы службы используют исходное значение в конструкторе Custom Resolver ('555'), независимо от значения, которое я передаю службе (также происходит, если я делаю вызов из другого браузера). Если я выключу сервер и перезапущу его, я могу передать новый параметр (который будет использоваться во всех других вызовах, пока я снова не выключу его).
Любая идея о том, почему это происходит?