如何构建通用包装器以将域对象与特定API解耦

本文关键字:对象 解耦 API 何构建 构建 包装 | 更新日期: 2023-09-27 18:13:40

我正在为第三方web服务(SOAP) api编写包装器类。我想抽象代码与API的交互,以便在业务关系发生变化时可以删除对第三方API的引用。考虑下面的代码:

public Tapitype ConvertToAPIImplementation<Tapitype>(APIConverter domainToApiConverter){
  return domainToApiConverter.ConvertToAPIObject(this);
}

我想做的是让我的函数ConvertToAPIImplementation接受转换器,该转换器将我的域对象转换为我们正在使用的期望API的类型。我应该如何实现这一点?

如何构建通用包装器以将域对象与特定API解耦

这是一个非常简单和常见的场景。参考GoF模式适配器、抽象工厂和代理。

[EDIT:添加更多代码来帮助说明解决方案]

你需要定义你自己的API(或抽象接口)来表示任何第三方API需要提供给你的应用程序的功能。

IPancakeMaker
{
    Pancake MakePancake(decimal radius);
}

然后写一个Provider来实现这个接口,并且依赖于你当前的第三方API…

WalmartPancakeMaker : IPancakeMaker
{
    Walmart3rdPartyAPI _w3paPancakeMaker = new Walmart3rdPartyAPI(string apiKey);
    // ... set 3rd party settings, defaults, etc
    // Implement IPancakeMaker
    public Pancake MakePankcake(decimal radius)
    {
        Walmart3rdPartyPancakeEntity thirdPartyPancake = _w3paPancakeMaker.BakeMeACakeJustAsFastAsYouCan(radius);
        return this.ConvertToPancakeInMyDomain(thirdPartyPancake);
    }
}

创建一个服务类(或其他编排)来控制与提供商的交互,并使用依赖注入来避免与提供商的紧密耦合…

public class MakePancakesService
{
    IPancakeMaker _pancakeMaker = null;
    // Constructor takes the concrete Provider of IPancakeMaker
    // Your calling code is not aware of the actual underlying API
    public MakePancakesService(IPancakeMaker pancakeMaker)
    {
        _pancakeMaker = pancakeMaker;
    }
}

使用流行的DI框架,如Unity或StructureMap。

http://unity.codeplex.com/

http://structuremap.net/structuremap/