.NET实现MediatR IRequestHandler时CS0738报错问题咨询
解决CS0738错误:返回类型不匹配问题
这个错误是因为MediatR接口的泛型定义与你的Handler返回类型不匹配,具体原因和两种修复方案如下:
原因分析
当你的Command实现IRequest(无返回值接口)时,对应的IRequestHandler<Command>要求Handle方法返回Task;但你的代码中Handle方法返回了Task<Unit>,导致返回类型不匹配。
修复方案
方案一:让Command返回Unit(推荐,符合MediatR常用实践)
修改Command实现IRequest<Unit>,同时更新Handler的泛型接口定义:
using Domain; using MediatR; using Persistence; namespace Application.Activities; public class Create { // 改为实现IRequest<Unit> public class Command : IRequest<Unit> { public Activity Activity { get; set; } } // 泛型添加Unit参数 public class Handler : IRequestHandler<Command, Unit> { private readonly DataContext _context; public Handler(DataContext context) { _context = context; } public async Task<Unit> Handle(Command request, CancellationToken cancellationToken) { _context.Activities.Add(request.Activity); // 建议传入cancellationToken到SaveChangesAsync await _context.SaveChangesAsync(cancellationToken); return Unit.Value; } } }
方案二:修改Handler返回类型为Task
如果不需要返回Unit,可以保持Command实现IRequest,同时将Handle方法的返回类型改为Task:
using Domain; using MediatR; using Persistence; namespace Application.Activities; public class Create { public class Command : IRequest { public Activity Activity { get; set; } } public class Handler : IRequestHandler<Command> { private readonly DataContext _context; public Handler(DataContext context) { _context = context; } // 返回类型改为Task public async Task Handle(Command request, CancellationToken cancellationToken) { _context.Activities.Add(request.Activity); await _context.SaveChangesAsync(cancellationToken); } } }
内容的提问来源于stack exchange,提问作者aryan singh
相关产品推荐
相关产品推荐

