【问题标题】:creating a web api wrapper around an existing API围绕现有 API 创建 Web api 包装器
【发布时间】:2018-01-19 02:32:42
【问题描述】:

Authorize.NET 提供very thorough SDK.

您可以简单地将其安装在您的解决方案中:

Install-Package AuthorizeNet

我们需要服务来包装 AuthorizeNet API 的所有功能。

为简单起见,假设 API 公开了以下方法:

public bool Pay(TransactionModel trans);
public bool Decline(Guid id);
public bool Refund(Guid id);

我们可以从我们自己的解决方案控制器方法轻松访问这些方法。例如:

[HttpPost]
public bool PayAuthNet([FromBody] AuthnetTransModel model)
{
   TransactionModel localTransModel = CreateLocalAuthModel(model);
   var authNet = new AuthorizeNet();
   return authNet.Pay(localTransModel);
}

但是,Authorize.NET 公开的 API 库非常庞大:

假设我们想要将这些控制器包装到自己的微服务中(希望对此方法提供反馈),有没有一种更简单的方法来包装这些 API 中的每一个,强制客户端通过我们的包装器服务,而不是让他们直接访问 Authorize.NET?

【问题讨论】:

  • 那个 API 不是已经是包装器了吗?为什么我们需要额外的层?
  • 因为我的老板说我们这样做。我们希望允许客户端使用授权网,但通过一种非常“受控”的机制,并且我们希望控制每个客户端可以访问的内容等,这就是我们需要包装器的原因
  • 哇,这相当广泛。就在我的脑海中,您可以尝试根据公开的 API 和路由/漏斗命令创建一个约定。但我认为 IMO 付出的努力不值得。
  • 如果你使用 Roslyn 似乎不太不切实际
  • @johnny5 您能否详细说明 roslyn 对此有何用处?

标签: c# .net asp.net-web-api2 visual-studio-2017 authorize.net


【解决方案1】:

这是一个简单的解释,因为它太长了,无法评论。

将使用伪代码来演示包装AuthorizeNet

使用 OP 中提供的示例

[HttpPost]
public bool PayAuthNet([FromBody] AuthnetTransModel model)
{
   TransactionModel localTransModel = CreateLocalAuthModel(model);
   var authNet = new AuthorizeNet();
   return authNet.Pay(localTransModel);
}

首先是命名约定。类似于 MVC 如何根据命名约定找到控制器,例如 Name/Action 如何映射到 NameController.Action

PayAuthNet     --> AuthorizeNet.Pay
DeclineAuthNet --> AuthorizeNet.Decline
RefundAuthNet  --> AuthorizeNet.Refund

然后使用反射可以确定方法参数类型,并且类似于 AutoMapper 工作方式的映射函数会将提供的模型 AuthnetTransModel 转换为函数的预期 TransactionModel 参数。

假设您可以使用表达式树来摆脱魔术字符串

public class BillingConroller : ApiController {    
    [HttpPost]
    public bool PayAuthNet([FromBody] AuthnetTransModel model) {
       return authorizeNetWrapper.Execute<BillingConroller>(c => c.PayAuthNet(model));
    }    
}

它会在内部检查表达式树以提取映射和执行匹配的包装 API 所需的信息

From expression tree:
    Method being invoked:  PayAuthNet
    Argument provider:     AuthnetTransModel 
After applying convention:
    Found matching method: AuthorizeNet.Pay
    Expected arguement:    TransactionModel
Construct command
    Create instance of TransactionModel and copy properties from provided model
    Invoke => authNet.Pay(localTransModel)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-21
    • 2020-02-22
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多