【发布时间】:2016-12-22 00:30:43
【问题描述】:
虽然我对 AutoMapper 比较陌生,但我在我正在开发的一个小项目中使用它。我以前从未遇到过使用它的问题,但现在我在将参数传递给自定义解析器时遇到了一些奇怪的行为。
场景如下:我从存储库中获取消息列表,然后将它们映射到它的前端友好版本。没什么特别的,只是对象之间的一些正常映射。我在该前端对象中有一个字段,它告诉某个用户是否已经为该消息投票,这就是我使用自定义解析器的目的(它是第二个“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;
}
我在 Web 服务上调用此方法,问题是:我第一次调用 Web 服务(使用 Web 服务控制台)时,它都运行良好。例如,如果我将 '555' 作为 userId 传递,我将使用正确的值访问此方法:
在自定义解析器中,值被正确传递给构造函数:
返回的结果是正确的。问题来了。我第二次调用服务时,传递了一个不同的参数(这次是'666'),到达自定义解析器的构造函数的参数是旧的参数('555')。这就是我的意思:
在映射对象之前,我们可以看到传递给构造函数的值是正确的('666'):
但是当它到达解析器的构造函数时,值是错误的,并且是旧的('555'):
对服务的所有后续调用都使用自定义解析器构造函数 ('555') 中的原始值,与我传递给服务的值无关(如果我从另一个浏览器进行调用,也会发生这种情况)。如果我关闭服务器并重新启动它,我可以传递一个新参数(将在所有其他调用中使用,直到我再次关闭它)。
知道为什么会这样吗?
【问题讨论】:
标签: parameter-passing automapper resolver