c# - 重构设计模式 : applying adapter pattern to 3rd party API

标签 c# design-patterns adapter

为了访问我们的帐户数据库的数据,我们需要通过第 3 方 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();

但是这似乎有些不对劲。我觉得我给服务承担了太多的责任来完成所有这些调用。

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

最佳答案

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

你的适配器可能应该提供一个更面向领域的接口(interface),例如

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
}

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

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

关于c# - 重构设计模式 : applying adapter pattern to 3rd party API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5237449/

相关文章:

c# - 在 C# 上从 object[] 转换为 double[]

c# - 无法使用/clr 选项从 Visual C++ 项目加载 CLR

c# - 为什么我的内存基准测试给出奇怪的结果?

oop - 适配器 - 适配器模式的任何真实示例

java - Android studio,在适配器中调用适配器

c# - 循环依赖

zend-framework - 使用 Doctrine 2 和 Repositories,服务层的目的是什么?

java - Iterator Class 和 foreach 构造之间的性能差异

android - 如何为 Facebook 之类的 Feed 的 ListView 适配器生成 UI

generics - 如果我有消息类型列表,如何在MassTransit中注册通用使用者适配器