2011-11-07 1 views
0

私はサードパーティのWebサービス(SOAP)APIのラッパークラスを作成しています。ビジネス関係が変更された場合にサードパーティAPIへの参照を削除できるように、コードとAPIとのやりとりを抽象化したいと思います。次のコードを考えてみましょう:ドメインオブジェクトを特定のAPIから切り離すための汎用ラッパーを構築するにはどうすればよいですか?

public Tapitype ConvertToAPIImplementation<Tapitype>(APIConverter domainToApiConverter){ 

    return domainToApiConverter.ConvertToAPIObject(this); 

} 

は、私は何をしたい、私たちが期待を使用しているタイプ希望APIに私のドメインオブジェクトを変換するコンバータでの私の機能ConvertToAPIImplementationテイクを持っています。これをどのように実装すればよいですか?

+0

あなたが今使っている方法を提供し、抽象的にしたいか、これは抽象的に試みをisalreadyましたか? – sll

答えて

1

これは非常に簡単で一般的なシナリオです。参照GoFパターンアダプタ、抽象ファクトリおよびプロキシ

[EDIT:ソリューションを説明するのを助けるために多くのコードを追加しました]

あなたがあなた自身のAPI(または抽象インタフェース)を定義する必要があります任意のサードパーティのAPIをアプリケーションに提供する必要がある機能を表しています。

IPancakeMaker 
{ 
    Pancake MakePancake(decimal radius); 
} 

そして、そのインターフェイスを実装し、現在のサードパーティの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; 
    } 
} 

は、UnityまたはのStructureMapとして人気のDIフレームワークを使用して...プロバイダへの密結合を避けるために、依存性の注入を使用しています。

http://unity.codeplex.com/

http://structuremap.net/structuremap/

関連する問題