如何构建通用包装器以将域对象与特定API分离?

时间:2011-11-07 20:36:31

标签: c#

我正在为第三方Web服务(SOAP)api编写一个包装类。我想以这样一种方式抽象我的代码与API的交互,如果业务关系发生变化,我可以删除对第三方API的引用。请考虑以下代码:

public Tapitype ConvertToAPIImplementation<Tapitype>(APIConverter domainToApiConverter){

  return domainToApiConverter.ConvertToAPIObject(this);

}

我想要做的是让我的函数ConvertToAPIImplementation接收一个转换器,它将我的域对象转换为我们正在使用的所需API的类型。我该如何实现呢?

1 个答案:

答案 0 :(得分:1)

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

[编辑:添加了更多代码以帮助说明解决方案]

您需要定义自己的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/