7

さまざまなサードパーティAPIと相互作用するクラスライブラリを構築しています。ファサードパターンを使用して、複雑で紛らわしい呼び出しへのアクセスを簡素化し、ファクトリパターンを使用して正しい実装を返しました。私は現在、実装の1つを構築しようとしていますが、エレガントなデザインを考えることはできません。

私が構築している実装では、URLを構築する必要があります(これはURIBuilderを介して行っています)。次に、URLを「実行」する必要があります。次に、Xmlの結果をクラスに逆シリアル化します。

HttpClientを使用して、作成したURIを使用してAPIを呼び出すことを計画していますが、クラスの構造がわかりません。私が考えたオプションは次のとおりです。

  1. 私の実装の基本クラスなので、を介して呼び出すことができますbase.InvokeURI(Uri myUri)

  2. 複数の実装で使用できるようにする分離クラス

また、逆シリアル化がどこにあるべきかわかりません。

4

2 に答える 2

12

この場合、インターフェイスを使用する方が適切だと思います。

public interface IURLInvoke 
{
    string InvokeURI(Uri myUri);
}

// some implementation
public class YourURLInvoker: IURLInvoke 
{
    public string InvokeURI(Uri myUri)
    {
         // do something
    }
}

public class YourClass 
{
    public IURLInvoke Invoker {get; set;}

    public void InvokeURI(Uri myUri)
    {
         if(Invoker == null)
              return; 

         string xml = Invoker.InvokeURI(Uri myUri);
         // put your code for deserialization here
    }
}

// here is an usage example:
YourClass a = new YourClass();
// set an Invoker, choose a strategy to invoke url
a.Invoker = new YourURLInvoker();
a.InvokeURI(url);

このアプローチは、戦略パターンとも呼ばれます

于 2013-01-23T09:59:38.037 に答える
2

アダプタ パターンと依存性注入を使用したダミー コードを参照してください。アイデアは、インターフェイスを作成して渡すことです

public class Adapter{
 public void processRequest(){
   RequestProcessor processor = new RequestProcessor();
   processor.processRequest();
 }
}

public class RequestProcessor{
  public void procesRequest(){
    Irequest request = new HTTPRequest();
    HTTPService service = new HTTPService();
    // fetch the uri from builder class
    URI url = URIBUIlder();
    string response = service.sendRequest(request,url);
    // now fetch type from just 
    Type t = Serializer.searialize<T>(response);

  }
}

public Class Serializer{
  public static  T searialize<T>(string xml){
  }
}

public interface IRequest{
 public string sendRequest(uri url);
}

public class HTTPRequest:IRequest{
 public string sendRequest(uri url){
  // instantiate actual http request here and return response
 }
}

//This will act as controller
public class HTTPService{
 public string sendRequest(IRequest request,uri url) {
  return request.sendRequest(url);
 }
}
于 2013-01-27T19:20:31.737 に答える