【问题标题】:How to map a C# string keyword to Mediator command or query?如何将 C# 字符串关键字映射到 Mediator 命令或查询?
【发布时间】:2022-12-14 17:00:28
【问题描述】:

在其中一个 Web API 项目中,我们收到一个字符串关键字作为有效负载参数。我们需要映射该字符串/关键字以执行相应的调解器查询/命令。

示例:如果 API 操作负载是 { "action" : "GetAllOrders" } 那么我们需要调用 GetAllOrders 查询。这样我们就有了很多返回对象响应的动作。注意-我们只有一种操作方法可以解决所有问题(很奇怪,但事实就是如此)

我们可以写

if(action == "GetAllOrders") then _mediatr.Send(query, .. );
else if(action == "GetAllProducts") then _mediatr.Send(query, .. );
else if(action == "GetAllCustomers ") then _mediatr.Send(query, .. );

我们可以编写 switch case 或许多 if else,但当然我们正在寻找一些好的模式或方法。谢谢。

【问题讨论】:

    标签: c# nuget asp.net-core-webapi mediatr


    【解决方案1】:

    你可以使用 MediatR 库,你可以在 Nuget 包管理器中轻松找到它。

    然后你可以像这样定义你的动作方法。

    public async Task<ActionResult<ApiResponse>> MethodName( ApiRequest a piRequest, [FromServices] IMediator mediator)
    {
        var a = await mediator.Send(apiRequest);
        return a;
    

    然后像这样声明你的处理程序类。

    public partial class YourHandler : RequestHandler<ApiRequest, ApiResponse>
    {
        protected override ApiResponse Handle(ApiRequestrequest)
        {
            //Write your logic here
            //and return response
        }
    

    编辑:基于 OP 添加的最后一条评论。

    因此,这完全取决于您希望实现它的处理程序的松散耦合程度。如果条件非常少,您可以使用 if else 来切换,但如果条件很多,您最终会破坏(SOLID 原则)。在这种情况下,您也可以有不同的处理程序。每个响应都可以有一个基响应类和派生类。因此,如果您的返回类型相同但一起处理不同,那么使用调解器模式就没有用了。当您只想修改特定处理时,拥有不同的处理程序将在这种情况下为您提供帮助。只会在您的特定处理程序中进行更改。

    【讨论】:

    • 您好,感谢您的回复。我们的设置与您提到的相同,但有特定要求。我已经在我的问题中更新了示例。
    • @KPP 请现在检查答案。我已根据您的评论和上次编辑对其进行了修改
    • 嗨,Vivek,是的,我们已经为所有事物提供了不同的处理程序,所以在某种程度上它在我们这边是松散耦合的。然而,API 操作方法具有我们正在实现的第三方接口,并且具有单一的入口和出口点。所以目前我们有很多使用 switch case 实现的条件。我们正在寻找可以将传入的字符串/关键字映射到特定命令/查询的东西,而无需任何硬编码字符串映射以避免 ifelse 或 switch case 等。感谢您的回复。
    • @KPP 你试过字典吗?或者在 config/JSON 文件中定义并从中读取以避免 if else
    • 嗨 Vivek,我们可以将映射设置保存在 dictionary/json/config/db 等中,但重点不在于保存映射的位置。但这里的重点是避免通过任何存储方式进行任何静态映射。因此,寻找在这种情况下有意义的动态/运行时映射。
    猜你喜欢
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 2018-04-27
    • 2017-10-27
    • 1970-01-01
    • 2017-04-14
    相关资源
    最近更新 更多