映射两个相同的模型,嵌套在自动映射器中

Map two identical models, nested with automapper

我做了一些研究,但找不到我想要的东西。

我有无穷无尽的菜单。我有一个 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>();
        }
    }

我在controller中这样调用

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,要么无法在 MenuDtoMenuViewModel 之间映射,要么无法找到定义的映射。

我已经测试了你的映射,它们完全没问题。因此,还有一种可能性是 AutoMapper 无法找到您的映射。

我假设您在评论部分提到的 Business LayerUI Layer 是两个独立的项目。由于 WebProfile 是在 UI Layer 中定义的,您必须告诉 AutoMapper 它应该搜索该程序集以找到映射。由于您的模型和 DTO 之间的映射正在运行,我猜您已经为 Business Layer.

中定义的 BusinessProfile 做了同样的事情

我不知道你现有的代码,但你可以这样做 - 在 Startup.Configure 方法中 add/modify 以下行 -

services.AddAutoMapper(typeof(IDtoMapping), typeof(IViewModelMapping));

其中IDtoMappingIViewModelMapping是在Business LayerUI Layer中声明的两个标记接口(空接口,仅用于标识声明它们的程序集) , 分别.