首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从'System.Collections.Generic.List<Create.Command>‘到“MediatR.IRequest<MediatR.Unit>”+ .NET Core + CQRS的隐式引用转换

从'System.Collections.Generic.List<Create.Command>‘到“MediatR.IRequest<MediatR.Unit>”+ .NET Core + CQRS的隐式引用转换
EN

Stack Overflow用户
提问于 2020-06-04 13:10:41
回答 1查看 3.4K关注 0票数 0

我在API控制器方法中获得一个列表,并将其传递给Handler,如下所示。我打算做的是循环遍历列表并将列表的所有项保存到DB中。

代码语言:javascript
运行
复制
public class Create
{
    public class Command : IRequest
    {
        public Guid A { get; set; }
        public string B { get; set; }
        public string C { get; set; }
        public bool D { get; set; }
    }

    public class Handler : IRequestHandler<List<Command>>
    {
        private readonly DataContext _context;
        private readonly IMapper _mapper;
        public Handler(DataContext context, IMapper mapper)
        {
            _mapper = mapper;
            _context = context;
        }

        public async Task<Unit> Handle(List<Command> request, CancellationToken cancellationToken)
        {
            // loop over the request list and save in the database
        }
    }
}

然而,在代码行'Handler‘下有一个红线:public class Handler : IRequestHandler<List<Command>>

在“Handler”上方盘旋,上面写着:

类型'System.Collections.Generic.List‘不能用作泛型类型或方法'IRequestHandler’中的类型参数'TRequest‘。没有从'System.Collections.Generic.List‘到'MediatR.IRequest’的隐式引用转换。应用程序(CS0311)

我的API控制器方法是:

代码语言:javascript
运行
复制
[HttpPost]
public async Task<ActionResult<Unit>> Create(List<Create.Command> commands) // not like this, it'll be a list
{
     return await Mediator.Send(commands);
}

return await Mediator.Send(commands);下的红线上写着:

不能隐式地将类型'object‘转换为'Microsoft.AspNetCore.Mvc.ActionResult’。存在显式转换(是否缺少强制转换?)APIcsharp(CS0266)

如果我在写问题的时候漏掉了一些信息,请放心,我会不断更新询问。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-04 17:30:30

所以我最终是如何解决这个问题的:

步骤1:与命令类中的道具不同,在命令类所在的同一个Create.cs类中有一个嵌套类:

代码语言:javascript
运行
复制
    public class CreateDto
    {
        public Guid A { get; set; }
        public string B { get; set; }
        public string C { get; set; }
        public bool D { get; set; }
    }

步骤2:将是命令类。命令类现在将是:

代码语言:javascript
运行
复制
    public class Command : IRequest
    {
        public List<CreateDto> SomeObjects { get; set; }
    }

步骤3:处理程序类将变成:

代码语言:javascript
运行
复制
public class Handler : IRequestHandler<Command>
    {
        private readonly DataContext _context;
        private readonly IMapper _mapper;
        public Handler(DataContext context, IMapper mapper)
        {
            _mapper = mapper;
            _context = context;
        }

        public async Task<Unit> Handle(Command request, CancellationToken cancellationToken)
        {
            foreach (var obj in request.SomeObjectss)
            {
                // logic
            }
            return Unit.Value;
        }
    }

步骤4:控制器方法将变成:

代码语言:javascript
运行
复制
    [HttpPost]
    public async Task<ActionResult<Unit>> Create(List<CreateDto> createDtos)
    {
        return await Mediator.Send(new Create.Command{SomeObjects = createDtos});
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62195463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档