我在我的应用程序中使用自动映射器,但我很痛苦,我正在使用下面的Tier-Architecture:
在我的App项目中,我使用ajax调用调用后端(Webapi),并且我在同一屏幕中调用多个调用来获取所需的必需数据,这是我的问题,auto的初始化mapper有时工作正常,而在其他一些工具中则给出了以下错误:
Exception = AutoMapper.AutoMapperMappingException
Message = Missing type map configuration or unsupported mapping.
FullText = AutoMapper.AutoMapperMappingException: Missing type map configuration or unsupported mapping
我对问题进行了排查,并注意到有大量的调用同时进入后端(异步)并且它们会覆盖彼此的初始化导致问题。
我尝试了很多方法来解决问题,比如在一个类中合并所有初始化
public static void ConfigureEntityMapping()
{
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Notification, NotificationModel>();
cfg.CreateMap<User, UserModel>();
cfg.CreateMap<LK_Status, StatusModel>();
cfg.CreateMap<CorrespondenceType, CorrespondenceTypeModel>();
cfg.CreateMap<Correspondence, CorrespondenceModel>().ForMember(dest => dest.StatusModel, opt => opt.MapFrom(src => src.LK_Status))
.ForMember(dest => dest.CorrespondenceTypeModel, opt => opt.MapFrom(src => src.CorrespondenceType))
.ForMember(dest => dest.CurrentAssignedUserModel, opt => opt.MapFrom(src => src.CurrentAssignedUser))
.ForMember(dest => dest.CheckoutByUserModel, opt => opt.MapFrom(src => src.CheckoutByUser));
});
}
但它不起作用。
这是我调用的DAL图层的示例代码
public static CorrespondenceModel GetByID(int ID)
{
using (Entities db = new Entities())
{
var correspondence = db.Correspondences.Find(ID);
if (correspondence != null)
{
AutoMapperConfiguration.ConfigureEntityMapping();
CorrespondenceModel correspondenceModel = Mapper.Map<Correspondence, CorrespondenceModel>(correspondence);
return correspondenceModel;
}
}
return null;
}
和
public static List<NotificationModel> GetAllByUserID(int loggedUserID)
{
using (ZajelEntities db = new ZajelEntities())
{
List<NotificationModel> NotificationModel = new List<NotificationModel>();
var corresondences = db.Notifications.Where(n => n.UserID == loggedUserID);
if (corresondences != null)
{
AutoMapperConfiguration.ConfigureEntityMapping();
foreach (var item in corresondences)
{
NotificationModel model = Mapper.Map<Notification, NotificationModel>(item);
NotificationModel.Add(model);
}
return NotificationModel;
}
}
return null;
}
我在这里做错了什么?
答案 0 :(得分:0)
我认为您应该绑定全局配置,包括应用程序入口点中的AutoMapper配置,例如Global.asax的{apner} Application_Start()
。理想情况下,映射器配置将为应用程序映射一次,并在一个位置。