当前位置: 代码网 > it编程>编程语言>Asp.net > 使用 .NET 8.0 mini API 和策略模式实现灵活的多支付方式的WebAPI

使用 .NET 8.0 mini API 和策略模式实现灵活的多支付方式的WebAPI

2024年08月02日 Asp.net 我要评论
策略模式是一种行为设计模式,它允许我们定义一系列算法,封装每个算法,并使它们可互换。在需要在运行时在不同算法之间切换的情况下,此模式特别有用。在这篇博客中,我们将探讨如何使用具有依赖项注入的最小 API 在 .NET 8.0 中实现策略模式,并创建一个支持多种付款方式的 Web API。创建一个接口,该接口声明一个方法以标准化支付处理逻辑。

前言

策略模式是一种行为设计模式,它允许我们定义一系列算法,封装每个算法,并使它们可互换。在需要在运行时在不同算法之间切换的情况下,此模式特别有用。在这篇博客中,我们将探讨如何使用具有依赖项注入的最小 api 在 .net 8.0 中实现策略模式,并创建一个支持多种付款方式的 web api。
在这里插入图片描述

支付处理系统

我们将创建一个支持多种付款方式的 web api:微信支付、支付宝支付、银行卡支付和信用卡支付。我们将使用策略模式来封装每种付款方式,并在它们之间动态切换。

1. 创建.net 8.0 mini api

在这里插入图片描述
选择asp.net core webapi作为当前项目的框架模板,项目名称为:paymentapi。选择.net 8.0 框架,启用openapi支持和使用顶级语句。
在这里插入图片描述

2. 定义策略界面

创建一个接口 ipaymentstrategy,该接口声明一个方法 processpayment(decimal amount) 以标准化支付处理逻辑。

namespace paymentapi.services
{
    public interface ipaymentstrategy
    {
        void processpayment(decimal amount);
    }
}

3. 实施具体策略

wechatpaymentstrategyalipaypaymentstrategybankcardpaymentstrategycreditcardpaymentstrategy 等类中实现 ipaymentstrategy 接口,每个类都提供用于处理付款的特定逻辑。具体的实现逻辑,需要集成各自的sdk,这里不详细展开。

namespace paymentapi.services
{
	public class wechatpaymentstrategy : ipaymentstrategy
	{
	    public void processpayment(decimal amount)
	    {
	        // implement wechat payment processing logic
	        console.writeline($"processing wechat payment of {amount:c}");
	    }
	}

	public class alipaypaymentstrategy : ipaymentstrategy
	{
	    public void processpayment(decimal amount)
	    {
	        // implement alipay payment processing logic
	        console.writeline($"processing alipay payment of {amount:c}");
	    }
	}

	public class bankcardpaymentstrategy : ipaymentstrategy
	{
	    public void processpayment(decimal amount)
	    {
	        // implement bank card payment processing logic
	        console.writeline($"processing bank card payment of {amount:c}");
	    }
	}

	public class creditcardpaymentstrategy : ipaymentstrategy
	{
	    public void processpayment(decimal amount)
	    {
	        // implement credit card payment processing logic
	        console.writeline($"processing credit card payment of {amount:c}");
	    }
	}
}

4. 为上下文创建界面

定义一个接口 ipaymentcontext,该接口声明方法 setpaymentstrategy(ipaymentstrategy paymentstrategy)executepayment(decimal amount) ,以管理和执行选定的付款策略。

namespace paymentapi.services
{
    public interface ipaymentcontext
    {
        void setpaymentstrategy(ipaymentstrategy paymentstrategy);
        void executepayment(decimal amount);
    }
}

5. 实现 paymentcontext

paymentcontext 类中实现 ipaymentcontext 接口,该接口存储当前付款策略并调用其 processpayment 方法。

namespace paymentapi.services
{
    public class paymentcontext : ipaymentcontext
    {
        private ipaymentstrategy _paymentstrategy;

        public void setpaymentstrategy(ipaymentstrategy paymentstrategy)
        {
            _paymentstrategy = paymentstrategy;
        }

        public void executepayment(decimal amount)
        {
            _paymentstrategy.processpayment(amount);
        }
    }
}

6. 最小 api 配置

依赖注入:将 paymentcontext 和具体策略类注册到依赖项注入容器中。
端点: 定义一个 post 端点 /pay,该端点接受金额和方法作为参数,根据方法设置适当的付款策略,并处理付款。

using paymentapi.services;

var builder = webapplication.createbuilder(args);

// add services to the container.

// register services
builder.services.addsingleton<ipaymentcontext, paymentcontext>();
builder.services.addsingleton<wechatpaymentstrategy>();
builder.services.addsingleton<alipaypaymentstrategy>();
builder.services.addsingleton<bankcardpaymentstrategy>();
builder.services.addsingleton<creditcardpaymentstrategy>();

// add services to the container.
builder.services.addcontrollers();
builder.services.addendpointsapiexplorer();
builder.services.addswaggergen();

var app = builder.build();

if (app.environment.isdevelopment())
{
    app.useswagger();
    app.useswaggerui();
}
app.usehttpsredirection();

app.mappost("/pay", async (decimal amount,
                           string method,
                           ipaymentcontext paymentcontext,
                           iserviceprovider serviceprovider) =>
{
    ipaymentstrategy strategy = method.tolower() switch
    {
        "wechat" => serviceprovider.getservice<wechatpaymentstrategy>(),
        "alipay" => serviceprovider.getservice<alipaypaymentstrategy>(),
        "bankcard" => serviceprovider.getservice<bankcardpaymentstrategy>(),
        "creditcard" => serviceprovider.getservice<creditcardpaymentstrategy>(),
        _ => throw new notsupportedexception("invalid payment method selected.")
    };

    paymentcontext.setpaymentstrategy(strategy);
    paymentcontext.executepayment(amount);

    return results.ok($"payment of {amount:c} using {method} processed successfully.");
});

app.useauthorization();

app.mapcontrollers();

app.run();

在这里插入图片描述

7. 运行应用程序

  • 构建并运行: 使用 dotnet run 运行应用程序。
  • 测试端点: 您可以通过使用 json 负载向 /pay 发送 post 请求来测试付款处理。
    在这里插入图片描述
    paymentapi.http编写测试调用示例
@paymentapi_hostaddress = http://localhost:5085

post {{paymentapi_hostaddress}}/weatherforecast/
accept: application/json

### 测试微信支付
post http://localhost:5085/pay?amount=100.00&method=wechat
content-type: application/json

### 测试支付宝支付
post http://localhost:5085/pay?amount=150.50&method=alipay
content-type: application/json


### 测试银行卡支付
post http://localhost:5085/pay?amount=200.75&method=bankcard
content-type: application/json

### 测试信用卡支付
post http://localhost:5085/pay?amount=300.00&method=creditcard
content-type: application/json

在这里插入图片描述

结论

通过将策略模式与 .net 8.0 中的最小 api 集成并使用依赖项注入,我们创建了一个灵活且可维护的付款处理系统。这种方法可以在运行时轻松地在不同的付款方式之间切换,并与现代开发实践保持一致。无论是添加新的支付方式还是修改现有的支付逻辑,这种设计都能有效地减少代码的耦合度,提高系统的扩展性和维护性。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com