如何构建通用包装器以将域对象与特定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的类型。我应该如何实现这一点?
这是一个非常简单和常见的场景。参考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/