不支持使用 AutoMapper 映射 .NET 5

Unsupported Mapping .NET 5 using AutoMapper

我有一个配置文件映射文件。

public class AutoMapperProfiles : Profile
    {
        public AutoMapperProfiles()
        {
            #region MyFunObjects
            CreateMap<CreateMyFunObjectDto, MyFunObject>();
            CreateMap<MyFunObject, MyFunObjectDetailDto>();
            #endregion
        }
    }

MyFunObject型号简单:

 public class MyFunObject 
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
    }

我的 dto 很简单:

 public class CreateMyFunObjectDto
    {
        [Required]
        public string Name { get; set; }
    }

 public class MyFunObjectDetailDto
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

Automapper 已在 Startup.cs

ConfigureServices 中注册
services.AddAutoMapper(typeof(Startup));

在我的服务中,这一行中断并抛出未处理的错误“Unsupported Mappings”。

 MyFunObject myFunObject = _mapper.Map<CreateMyFunObjectDto, MyFunObject >(createMyFunObjectDto);

这在另一个方法调用中也失败了。

return _mapper.Map<List<MyFunObjectDetailDto>>(myFunObjectList);

我错过了什么?

堆栈跟踪:

blazor.server.js:19 [2021-01-30T15:26:00.306Z] Error: AutoMapper.AutoMapperMappingException: Error mapping types.

Mapping types:
Object -> List`1
System.Object -> System.Collections.Generic.List`1[[Ruak_Models.DTOs.StatusDtos.StatusDetailDto, Ruak_Models, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
 ---> AutoMapper.AutoMapperMappingException: Missing type map configuration or unsupported mapping.

Mapping types:
Status -> StatusDetailDto
Ruak_Data.Models.Status -> Ruak_Models.DTOs.StatusDtos.StatusDetailDto
   at lambda_method90(Closure , Status , StatusDetailDto , ResolutionContext )
   at lambda_method89(Closure , Object , List`1 , ResolutionContext )
   --- End of inner exception stack trace ---
   at lambda_method89(Closure , Object , List`1 , ResolutionContext )
   at Ruak_Business.Services.StatusService.StatusService.GetStatuses() in C:\Code\BlazorRuak\RuakBlazor\Ruak\Ruak_Business\Services\StatusService\StatusService.cs:line 53
   at Ruak_Server.Pages.Objectives.ObjectiveList.OnInitializedAsync() in C:\Code\BlazorRuak\RuakBlazor\Ruak\Ruak_Server\Pages\Objectives\ObjectiveList.razor.cs:line 28
   at Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync()
   at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle)

AutoMapperAutoMapperProfiles class 中找不到您有 defined/configured 的地图。最可能的原因是配置文件 class 与包含 Startup class.

的程序集位于不同的程序集中

如果是这种情况,那么您可以在包含 AutoMapperProfiles class -

的程序集中创建一个标记界面
public interface IMappingProfile
{
    //
}

它的唯一目的是 mark/identify 包含您的地图的程序集。

然后注册AutoMapper为-

services.AddAutoMapper(typeof(IMappingProfile));

编辑:

使用标记界面只是我个人的喜好,因为我倾向于为我的域模型创建单独的配置文件 classes。因此,您可以简单地省略界面并使用您的个人资料 class 类型进行注册,类型为 -

services.AddAutoMapper(typeof(AutoMapperProfiles));