多个 API 调用:设计模式

Posted

技术标签:

【中文标题】多个 API 调用:设计模式【英文标题】:Multiple API Calls : Design Patterns 【发布时间】:2016-10-11 20:26:25 【问题描述】:

我必须调用具有多个 API 的多个服务。他们中的少数人基本上被读取(他们返回一些数据)并且他们中的少数人改变了几个对象的状态(他们基本上更新了几个对象的状态)。

我正在寻找可以应用于上述场景的design pattern

代码示例

让我们举一个服务 A 的小例子

AccountInfo A.getAccountInfo() 
void A.setAccountData(AccountInfo) 
AccountStatus A.getStatusForAccount 

...

我想有一个通用接口

interface CallAPI<Input , Output> 
   public Output execute(Input)

每个 API 调用都会实现这个接口,我可以使用工厂模式来获取 API 的实例。

我想知道是否有更好的模式,或者可以用不同的方式重构。 API 和服务只会增加,并且应该更容易设置新的 API,并且客户端不应该有额外的开销来为新的 API 编写适配器。

【问题讨论】:

看看 Retrofit 它与您尝试实现的目标类似 【参考方案1】:

最好的方法是从与数据库、基础设施细节等无关的可靠设计开始。要走的路是使用 FactoryMethod,如果要创建一个对象系列,请使用抽象工厂,这样您就可以拥有 SqlFamily 对象、JsonFamily 对象等。然后您可以创建业务规则,您可以使用多个服务,做一些更有趣的事情。好的设计意味着使用多种设计模式,因此除了工厂之外,还可以选择使用模板方法进行代码重用、策略模式等。这是您可以识别上面讨论的不同设计模式的代码:

public interface IRead<T>

    T Fetch();


public abstract class ServiceA

    public abstract void OperationA();
    public abstract void OperationB();


public abstract class ServiceB

    public abstract void OperationD();
    public abstract void OperationE();


public abstract class JsonServiceAReaderTemplate : IRead<ServiceA>

    public abstract ServiceA Fetch();


public sealed class JsonServiceAFetcher : JsonServiceAReaderTemplate

    /// <summary>
    /// Get parameters needded to load from json
    /// </summary>
    public JsonServiceAFetcher()
    

    
    public override ServiceA Fetch()
    
        //Load from Json store
        throw new NotImplementedException();
    


public abstract class JsonServiceBReaderTemplate : IRead<ServiceB>

    public abstract ServiceB Fetch();


public sealed class JsonServiceBFetcher : JsonServiceBReaderTemplate

    /// <summary>
    /// Get parameters needded to load from json
    /// </summary>
    public JsonServiceBFetcher()
    

    
    public override ServiceB Fetch()
    
        //Load from Json store
        throw new NotImplementedException();
    


public sealed class ServicesGateway

    public ServiceA ServiceA  get; 
    public ServiceB ServiceB  get; 

    public ServicesGateway(IRead<ServiceA> serviceA, IRead<ServiceB> serviceB)
    
        ServiceA = serviceA.Fetch();
        ServiceB = serviceB.Fetch();
    


public interface IBusinessRule

    void Execute();


public sealed class BusinessRuleServiceAServiceB : IBusinessRule

    private readonly ServicesGateway servicesGateway;

    public BusinessRuleServiceAServiceB(ServicesGateway servicesGateway)
    
        this.servicesGateway = servicesGateway;
    

    public void Execute()
    
        var serviceA = servicesGateway.ServiceA;
        var serviceB = servicesGateway.ServiceB;
        serviceA.OperationA();
        serviceA.OperationB();
        serviceB.OperationD();
        serviceB.OperationE();
    


public sealed class ClientCode

    public void Run()
    
        //Inject from IoC
        ServicesGateway gateway = new ServicesGateway(new JsonServiceAFetcher(), new JsonServiceBFetcher());
        var businessRule = new BusinessRuleServiceAServiceB(gateway);
        businessRule.Execute();
    

希望这会有所帮助!

【讨论】:

以上是关于多个 API 调用:设计模式的主要内容,如果未能解决你的问题,请参考以下文章

什么是API网关模式

Node.js 中对 API 的异步调用模式

架构模式:API组合

我应该如何聚合多个 API 请求?

SoC嵌入式软件架构设计之六:API设计方法

在 PySpark SQL 中并行执行读写 API 调用