c# - automapper 中没有为此对象定义无参数构造函数

标签 c# asp.net asp.net-core automapper

问题

我有以下值解析器:

public class StudentResolver : IValueResolver<Lesson, LessonResponse, UserResponse>
{
    private readonly ApplicationDbContext _dbContext;

    public StudentResolver(ApplicationDbContext dbContext)
    {
        _dbContext = dbContext;
    }
    
    public UserResponse Resolve(
        Lesson lesson, 
        LessonResponse response, 
        UserResponse member, 
        ResolutionContext context)
    {
        var user = _dbContext.Users
            .Where(x => x.Id == lesson.StudentId)
            .FirstOrDefault();
        if (user == null)
            return null;
        var result = Mapper.Map<UserResponse>(user); // this line triggers a "no parameterless constructor", why?
        return result;
    }
}

此解析器尝试获取此模型的 Student 属性:

public class LessonResponse
{
    public string Id { get; set; }

    public UserResponse Student { get; set; }
}

但是在线:

var result = Mapper.Map<UserResponse>(user);

我得到:

{System.MissingMethodException: No parameterless constructor defined for this object. at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor) at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) at System.Activator.CreateInstance(Type type, Boolean nonPublic) at System.Activator.CreateInstance(Type type) at AutoMapper.MappingOperationOptions`2.CreateInstanceT}

该表达式中唯一应该创建的类型是 UserResponse,其定义如下:

public class UserResponse
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
    public string PhoneNumber { get; set; }
    public string Picture { get; set; }
    public string X { get; set; }

    public bool IsAdmin { get; set; }
    public bool IsClient { get; set; }
    public bool IsInstructor { get; set; }
}

但它是可构造的,那么我做错了什么?


额外

映射配置文件如下:

public class MappingProfile : Profile 
{
    public MappingProfile() {
        CreateMap<Lesson, LessonResponse>()                
            .ForMember(
                dest => dest.Student,
                opts => opts.ResolveUsing<StudentResolver>());

    }
}

用户的映射是:

public class MappingProfile : Profile 
{
    public MappingProfile() {
        CreateMap<ApplicationUser, UserResponse>()
            .ForMember(
                dest => dest.FullName, 
                opts => opts.MapFrom(
                    origin => origin.FirstName + " " + origin.LastName))
            .ForMember(
                dest => dest.IsAdmin,
                opts => opts.ResolveUsing<IsAdminResolver>())
            .ForMember(
                dest => dest.IsInstructor,
                opts => opts.ResolveUsing<IsInstructorResolver>())
            .ForMember(
                dest => dest.IsClient,
                opts => opts.ResolveUsing<IsClientResolver>());
    }
}

bool 解析器都类似于:

public class IsAdminResolver : IValueResolver<ApplicationUser, UserResponse, bool>
{
    private readonly UserManager<ApplicationUser> _userManager;

    public IsAdminResolver(UserManager<ApplicationUser> userManager)
    {
        _userManager = userManager;
    }
    
    public bool Resolve(ApplicationUser user, UserResponse response, bool member, ResolutionContext context)
    {
        return _userManager.IsInRoleAsync(user, "Admin").Result;
    }
}

最佳答案

由于我的注意力不集中,我遇到了同样的问题。我使用 Visual Studio 快速提示默认构造函数为继承自 Profile 的类生成了它,该类是 protected 而不是 public。我希望这会对某人有所帮助。

关于c# - automapper 中没有为此对象定义无参数构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47189545/

相关文章:

c# - 为类和协议(protocol)创建 Xamarin iOS 绑定(bind)

c# - 如何在 C# 应用程序中打开 sapi 火车窗口?

c# - 如何创建新的实体对象,在 SaveChanges() 之前在模型中修改它

c# - 使用 Serilog .NET Core 进行日志记录不输出

asp.net-core - 当目标为 "dependencies"时,我应该如何在 project.json 中定义 "frameworkAssemblies"和 "dotnet"

rest - ASP.NET Core 5 路由重定向

c# - 如何在不创建对象的情况下使用 C# 序列化 Guid?

c# - 在 try block 而不是 catch block 中抛出异常?

javascript - VB.Net 中连续 4 个文本框的 gridview

asp.net - MVC.NET 4 中的 Robots.txt 文件