重构设计模式:将适配器模式应用于第三方API

时间:2011-03-08 19:46:29

标签: c# design-patterns adapter

为了访问我们的帐户数据库的数据,我们需要通过第三方API,这只是作为我们解决方案的参考添加的另一个程序集。

在我们的服务中,有几种类型的API调用类似于:

 ICustomers customerCollection =GetCollection(OrgId,OrgUnit,CustomerInfo, "Customers");
       {
           customerCollection.Filter.Add("MasterCustomerId", QueryOperatorEnum.Equals, masterCustomerID);
           customerCollection.Filter.Add("SubCustomerId", QueryOperatorEnum.Equals,subCustomerID);
       }
       customerCollection.Fill();

调用customerCollection.Fill()后,API会转到数据库并使用适当的过滤器运行查询。返回的对象属于API。在此服务中,对API的许多调用都具有独特的过滤要求。

我想要做的是使用Adapter模式将这些调用放在我自己的类后面并返回我拥有的对象。然后我可以从我的服务中对我的适配器进行编码,让他们担心呼叫第三方API。

问题在于我不知道处理过滤器所有变体的好方法,所以我不是简单地在我的适配器中重新创建过滤语法。

我可以制作扩展/静态方法,将API的过滤系统转换为流畅的语法,所以它看起来像这样:

customerCollection.Filter(“MasterCustomerId).Equals(masterCustomerId).Filter(SubCustomerId).Equals(subCustomerId).Fill();

但有些事情似乎错了。我觉得我对服务负有太多责任去做所有这些电话。

我正在努力发展我的面向对象技能,如果有人能帮助我指出在这个问题上的正确方向,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

我不会尝试使用您的对象重新创建API。它会创建一个非常紧密耦合的关联,并且不太可能给你带来很多好处。

您的适配器应该提供更加面向域的接口,例如

public IList<MyCustomerObjects> GetCustomers()
{
    //Call out to the third party API with the appropriate filters

    //foreach object in 3rd party collection, wrap in adapter class and add to list

    //return list of your objects
}

(这几乎是来自Domain-Driven design btw的存储库模式)。

换句话说,您让适配器担心第三方API中需要哪些过滤条件,而您的调用代码处理合理的业务/域级概念。