【发布时间】:2015-05-12 23:42:32
【问题描述】:
我们正在为我的 asp.net MVC/Web API 项目在方法定义中配置 automapper,如下所示。
public HttpResponseMessage GetDetails(int assignmentId)
{
var valuation = _valuationRepository.GetOneById(assignmentId);
Mapper.CreateMap<UserLicenses, UserLicenseResponseModel>()
.ForMember(dest => dest.State, opt => opt.MapFrom(src => src.States.StateCode))
.ForMember(dest => dest.UserId, opt => opt.MapFrom(src => src.UserId))
.ForMember(dest => dest.FullName, opt => opt.MapFrom(src => (src.UserProfile != null) ? (src.UserProfile.FirstName + ' ' + src.UserProfile.LastName) : " "));
Mapper.CreateMap<AdditionalExpenses, AdditionalExpensesResponseModel>();
Mapper.CreateMap<ValuationAssignment, ValuationAssignmentResponseModel>();
var model = Mapper.Map<ValuationAssignmentResponseModel>(valuationAssignment);
return Request.CreateResponse(HttpStatusCode.OK, new { Assignment = model });
}
我们注意到 api 随机不映射值,响应 json 为映射字段返回空值。
发生这种情况时,我正在回收应用程序池,它似乎可以工作一段时间,但我们又遇到了问题。
文档是指将所有映射存储在 Global.asax 中的 Application_Start 中。但是,我们在方法定义中设置它们 - 这就是我们看到这个问题的原因吗?
【问题讨论】:
-
为什么需要为每个请求重新创建映射规则,而不是在应用启动时一次?
-
谢谢杰森。如果我将它们放在 app_start 中,如何从存储库调用中注入/替换某些字段?
-
我想我看到的方式是我们使用 AutoMapper 配置 ModelA 到 ModelA 的映射一次以供重用。如果我在每个请求中都自定义映射项,我最好放弃 AutoMapper 并在存储库或服务中进行手动映射,因为我并没有真正重用任何规则。你不能定义多重
UserLicenses规则吗? UserLiceses 到 X,UserLicenses 到 Y 等。如果这还不够可重用,您还可以映射到接口:UserLiceses 到 IUser 或 ILicense...此外,Mapper和CreateMap是静态的,这可能就是您拥有的原因当您根据请求重新定义它们时出现问题。
标签: asp.net-web-api automapper