使用异步调用的Auto Mapper初始化问题

时间:2016-10-14 15:41:06

标签: c# automapper

我在我的应用程序中使用自动映射器,但我很痛苦,我正在使用下面的Tier-Architecture:

  1. DAL Layer(类库项目)这里我正在使用Auto mapper
  2. BLL Layer(类库项目)
  3. 服务层(Web Api项目)
  4. 网络应用程序(网站项目)
  5. 在我的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;
        }
    

    我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

我认为您应该绑定全局配置,包括应用程序入口点中的AutoMapper配置,例如Global.asax的{apner} Application_Start()。理想情况下,映射器配置将为应用程序映射一次,并在一个位置。