【问题标题】:Array request in MediatR command handlerMediatR 命令处理程序中的数组请求
【发布时间】:2022-02-02 21:02:41
【问题描述】:

我有以下要求

[
  {
    
    "firstName": "first_name",
    "lastName": "last_name",
    "phoneNumber": "phone_niumber",
    "email": "emai_domaon",
    "fax": "fax_number",
    "phoneNumberExt": "ext1",
    "mobileNumber": "394858"
  },
  {
    "firstName": "first_nam2e",
    "lastName": "last_name2",
    "phoneNumber": "phone_2niumber",
    "email": "emai_domaon2",
    "fax": "fax_number2",
    "phoneNumberExt": "ext12",
    "mobileNumber": "3948528"
  }
]

它是一个数组请求,我如何定义IRequestHandler, 我创建了另一个类并在处理程序类中使用

 public class ContactCommandRequest : BaseContact
    {
        /// <summary>
        /// Gets or sets phone number extension.
        /// </summary>
        public string PhoneNumberExt { get; set; }

        /// <summary>
        /// Gets or sets mobile number.
        /// </summary>
        public string MobileNumber { get; set; }

    }

并为 IRequest 使用另一个类

public class ContactCommand : IRequest<StudentRegisterResponse>
    {
        public ContactCommand(List<ContactCommandRequest> req)
        {
            this.Contacts = req;
        }

        public List<ContactCommandRequest> Contacts { get; private set; }
    }

内部控制器

public async Task<IActionResult> ContactDetails([FromBody] List<ContactCommand> request, CancellationToken cancellationToken = default)
        {
            return Ok(await this.mediator.Send(new ContactCommand(request), cancellationToken));
        }

MediatR中处理数组列表请求有没有更好的方法

【问题讨论】:

  • 似乎是一些双重嵌套。你的控制器得到一个List&lt;ContactCommand&gt;,但这个列表中的每个项目也有一个List&lt;ContactCommandRequest&gt;。所以清理这个设计问题(如果是一个)。此外,使用IRequest&lt;IReadOnlyList&lt;StudentRegisterResponse&gt;&gt;(或类似的)和相应的处理程序来使用处理程序中的列表是合法的。
  • @Oliver 存在设计问题,我只关注该问题。如何使用 mediatr 处理列表,您能否指导修复它

标签: c# microservices cqrs mediatr


【解决方案1】:

只是想给你一个关于如何设置它的草图。以下是一些包含所需信息的基类:

public class Contact : BaseContact
{
    public string PhoneNumberExt { get; set; }
    public string MobileNumber { get; set; }
}

public class BaseContact
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Fax { get; set; }
}

public class StudentRegisterResponse
{
    public bool Done { get; set; }
}

如果主体包含一个普通数组,则取决于您可以推断传入数据的设计多少:

public class ContactsCreateRequest : IRequest<StudentRegisterResponse>
{
    public IReadOnlyList<Contact> Contacts { get; set; }
}

public static async Task<object> CreateContacts([FromBody] IReadOnlyList<Contact> contacts, CancellationToken cancellationToken)
{
    var request = new ContactsCreateRequest { Contacts = contacts };
    var response = await mediator.Send(request, cancellationToken);

    return Ok(response);
}

或者这个:

public class ContactsCreateRequest : IRequest<StudentRegisterResponse>
{
    [FromBody]
    public IReadOnlyList<Contact> Contacts { get; set; }
}

public static async Task<object> CreateContacts(ContactsCreateRequest request, CancellationToken cancellationToken)
{
    var response = await mediator.Send(request, cancellationToken);

    return Ok(response);
}

注意FromBodyAttribute 的使用,它只出现一次。在方法参数或属性参数上。 FromQueryAttribute 可以在两个级别上出现多次。

处理程序本身应该是这样的:

public class ContactsCreateHandler : IRequestHandler<ContactsCreateRequest, StudentRegisterResponse>
{
    public async Task<StudentRegisterResponse> Handle(ContactsCreateRequest request, CancellationToken cancellationToken)
    {
        foreach (var contact in request.Contacts)
        {
            Console.WriteLine($"{contact.FirstName} {contact.LastName}");
        }

        await Task.Delay(0);

        return new StudentRegisterResponse { Done = true };
    }
}

【讨论】:

    猜你喜欢
    • 2021-06-22
    • 2021-08-24
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2012-01-08
    相关资源
    最近更新 更多