围绕现有API创建Web api包装器

时间:2017-08-10 17:57:39

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

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);
}

然而,API库非常庞大,Authorize.NET公开了:

enter image description here

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

1 个答案:

答案 0 :(得分:2)

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

将使用伪代码演示包装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)