2013-01-21 48 views
7

我正在構建一個與各種第三方API交互的類庫。我使用了Facade模式來提供對複雜和令人困惑的調用的簡化訪問,並使用工廠模式來返回正確的實現。我現在正在試圖構建一個實現,但不能想到一個優雅的設計。創建API URL的設計模式

我正在構建的實現需要構建一個URL(我通過URIBuilder來完成)。然後我需要「執行」網址。然後我將Xml結果反序列化爲一個類。

我打算使用HttpClient調用帶有構建的URI的api,但我不確定如何構造類。我想到的選項有:

  1. 我的實現的基類可以通過base.InvokeURI(Uri myUri)調用它。

  2. 伊朗式分居類,因此它可以通過多種實現

使用我也不能確定,其中反序列化應該駐留。

+2

你看[微軟的Web API(http://www.asp.net/web-api)? –

+3

你想達到什麼目標,看起來你正在玩模式賓果遊戲。 –

回答

11

我認爲在這種情況下,使用界面更適合:

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

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

pubic 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); 

這種方法也被稱爲Strategy Pattern

1

請使用適配器模式和依賴注入看空代碼。 想法是創建一個接口,並通過它周圍

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); 
} 
}