问题描述
我做了一些研究,但是找不到我想要的东西。
我有无尽的菜单。我有用于该菜单的MenuDTO和Menuviewmodel。我没有在模型和DTO之间进行匹配的问题,但是在将DTO映射到viewmodel时遇到了麻烦。显然我找不到解决方案,您能帮忙吗?
我的MenuDTO对象
public class MenuDto : BaseDto
{
public string Name { get; set; }
public string Icon { get; set; }
public string Order { get; set; }
public string Url { get; set; }
public bool IsVisible { get; set; }
public int ParentId { get; set; }
public MenuDto ParentMenu { get; set; }
public List<MenuDto> Menus { get; set; }
}
和Menuviewmodel
public class Menuviewmodel
{
public int Id { get; set; }
public bool IsActive { get; set; }
public string Name { get; set; }
public string Icon { get; set; }
public string Order { get; set; }
public string Url { get; set; }
public bool IsVisible { get; set; }
public int ParentId { get; set; }
public Menuviewmodel ParentMenu { get; set; }
public List<Menuviewmodel> Menus { get; set; }
}
这就是我映射MenuDTO和Menuviewmodel对象的方式。
public class WebProfile : Profile
{
public WebProfile()
{
CreateMap<MenuDto,Menuviewmodel>();
CreateMap<Menuviewmodel,MenuDto>();
}
}
我在控制器中这样称呼
var navMenuItems = _mapper.Map<List<Menuviewmodel>(_menuService.GetNavMenus());
我收到的错误消息是;
AutoMapperMappingException: Missing type map configuration or unsupported mapping.
Mapping types:
MenuDto -> Menuviewmodel
BiPortal2020.Business.ServiceDTOs.Menu.MenuDto -> BiPortal2020.WebUI.Areas.Admin.Models.Menu.Menuviewmodel
lambda_method(Closure,MenuDto,Menuviewmodel,ResolutionContext )
AutoMapperMappingException: Error mapping types.
Mapping types:
Object -> List`1
System.Object -> System.Collections.Generic.List`1
解决方法
错误消息表示-AutoMapper无法在MenuDto
和MenuViewModel
之间进行映射,或者无法找到已定义的映射。
我已经测试了您的映射,它们完全可以。因此,AutoMapper仍然无法找到您的映射。
我假设您在注释部分提到的Business Layer
和UI Layer
是两个单独的项目。由于WebProfile
是在UI Layer
中定义的,因此您必须告诉AutoMapper它应该搜索该程序集以查找映射。由于您在模型和DTO之间的映射正在工作,因此我猜您已经对BusinessProfile
中定义的Business Layer
做了同样的事情。
我不知道您现有的代码,但是您可以执行以下操作-在Startup.Configure
方法中添加/修改以下行-
services.AddAutoMapper(typeof(IDtoMapping),typeof(IViewModelMapping));
其中IDtoMapping
和IViewModelMapping
分别是在Business Layer
和UI Layer
中声明的两个标记接口(空接口,仅用于标识声明它们的程序集)