【问题标题】:Refactor to Design Patterns: applying adapter pattern to 3rd party API重构设计模式:将适配器模式应用于 3rd 方 API
【发布时间】:2011-03-08 19:46:29
【问题描述】:

为了访问我们的 Accounts 数据库的数据,我们需要通过一个 3rd 方 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 的许多调用都具有独特的过滤要求。

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

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

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

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

但这似乎有些不对劲。我觉得我对服务承担了太多责任,无法完成所有这些调用。

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

【问题讨论】:

    标签: c# design-patterns adapter


    【解决方案1】:

    我不会尝试使用您的对象重新创建他们的 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
    }
    

    (顺便说一句,这几乎是域驱动设计中的存储库模式)。

    换句话说,您让适配器担心在 3rd 方 API 中需要什么过滤标准,而您的调用代码处理明智的业务/域级概念。

    【讨论】:

    • 您也可以使用类似 automapper 的东西将原生 api 对象转换为您自己的。或者,您可以编写一个扩展方法来为您进行转换。
    • 基本上你描述的模式是我正在努力的方向,但我对如何正确处理它有点困惑。从我的客户端代码(服务)的角度来看,我想这样调用:return _repository.GetCustomers(masterCustomerId); 但是,在此调用中需要执行一些业务规则,因此我需要一个额外的层/模式来实现这些业务规则。现在我称该层为“立面”,但我不知道这是否是正确的方法
    猜你喜欢
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多