8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在 ASP.NET Core 中注入 AutoMapper 时出现问题。错误:公共参数化构造函数必须仅包含与声明的参数匹配的参数

Chrysophylaxs 2月前

42 0

我有一个 ASP.NET Core Web API 项目。为了配置 AutoMapper,我在 Program.cs 文件中添加了以下代码:builder.Services.AddAutoMapper(typeof(Program));我将 AutoMapper 注入...

我有一个 ASP.NET Core Web API 项目。为了配置 AutoMapper,我在文件中添加了以下代码 Program.cs

 builder.Services.AddAutoMapper(typeof(Program));

我在我的服务中注入了 AutoMapper, BpmsServices 如下所示:

public class BpmsServices(
    IMapper mapper,
    IRepository<Workflow> workflowRepository)
{
    public IMapper DataMapper { get;  } = mapper;
    public IRepository<Workflow> WorkflowRepository { get; } = workflowRepository;
}

在 API 文件中,我有:

 public static IEndpointRouteBuilder MapWorkflowDesignApiV1(this IEndpointRouteBuilder app)
 {
     var api = app.MapGroup("api/workflow")
         .HasApiVersion(1.0);

     api.MapPut("/Node/CreateUpdate", CreateUpdateNode);

     return app;
 }       

 public static async Task<Workflow> CreateUpdateNode([AsParameters] BpmsServices services, NodeDto node)
 {
     var  = await services.WorkflowRepository
          .Include("Nodes")
          .FirstOrDefaultAsync(s => s.Id == node.WorkflowId);

     if (node.Id != 0)
     {
         .AddNode(services.DataMapper.Map<NodeDto, Node>(node));
     }
     else
     {
         .UpdateNode(services.DataMapper.Map<NodeDto, Node>(node));
     }

     await services.WorkflowRepository.SaveChangesAsync();

     return;
 }

这是我得到的例外:

System.InvalidOperationException:公共参数化构造函数必须仅包含与类型“BpmsServices”声明的公共属性匹配的参数。

问题是什么?

帖子版权声明 1、本帖标题:在 ASP.NET Core 中注入 AutoMapper 时出现问题。错误:公共参数化构造函数必须仅包含与声明的参数匹配的参数
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Chrysophylaxs在本站《asp.net-core》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 正如我在评论中提到的,这是由于您注释了 BpmsService using [AsParameters] ,它尝试绑定来自请求的参数。您不是 BpmsService 从请求中获取,而是从服务容器中获取,因此您希望改为使用 [FromServices]

    严格来说,这里不需要注释,因为 ASP.NET 将尝试自动定位和绑定,但有时注释会有所帮助,因为它们是明确的。

    builder.Services.AddAutoMapper(typeof(Program));
    
    builder.Services.AddScoped<IRepository<Workflow>, WorkflowRepository>();
    builder.Services.AddScoped<IBpmsServices, BpmsServices>();
    
    public static IEndpointRouteBuilder MapWorkflowDesignApiV1(this IEndpointRouteBuilder app)
     {
         var api = app.MapGroup("api/workflow")
             .HasApiVersion(1.0);
    
         api.MapPut("/Node/CreateUpdate", CreateUpdateNode);
    
         return app;
     }       
    
     public static async Task<Workflow> CreateUpdateNode([FromServices] BpmsServices services, [FromBody] NodeDto node)
     {
         var  = await services.WorkflowRepository
              .Include("Nodes")
              .FirstOrDefaultAsync(s => s.Id == node.WorkflowId);
    
         if (node.Id != 0)
         {
             .AddNode(services.DataMapper.Map<NodeDto, Node>(node));
         }
         else
         {
             .UpdateNode(services.DataMapper.Map<NodeDto, Node>(node));
         }
    
         await services.WorkflowRepository.SaveChangesAsync();
    
         return;
     }
    

    我已经对您的服务的生命周期做出了假设,因此请随意调整以适合您的情况。

  • 正如@StevePy 所说,类的构造函数参数应该与该类的公共属性直接匹配。您正在使用带有初始化程序的自动属性(

  • 您能否包含 Node 实体的定义,包括构造函数。我怀疑您只有参数化的构造函数,但 Automapper 不愿意尝试从您的 NodeDto 类解析匹配的公共属性。(不过不确定为什么错误会提到 BpmsServices。此外,当涉及到更新时,我不会使用这种方法。Automapper 有一个

返回
作者最近主题: