2013-01-21 57 views
7

Tôi đang xây dựng thư viện lớp tương tác với nhiều API của bên thứ ba khác nhau. Tôi đã sử dụng một mẫu mặt tiền để cung cấp truy cập đơn giản đến các cuộc gọi phức tạp và khó hiểu và một mẫu nhà máy để trả về việc triển khai chính xác. Tôi đang cố gắng xây dựng một trong những triển khai nhưng không thể nghĩ ra một thiết kế thanh lịch.Mẫu thiết kế để tạo URL API

Việc triển khai i am xây dựng yêu cầu URL phải được tạo (mà tôi đang thực hiện qua URIBuilder). Sau đó tôi cần phải "thực thi" url. Sau đó tôi deserialize kết quả Xml vào một lớp.

Tôi đang lên kế hoạch sử dụng HttpClient để gọi api với URI mà tôi đã tạo, nhưng tôi không chắc chắn về cách cấu trúc lớp. Các tùy chọn tôi đã nghĩ đến là:

  1. Lớp cơ sở của việc triển khai của tôi để có thể gọi qua base.InvokeURI(Uri myUri).

  2. Một lớp tách để nó có thể được sử dụng bởi nhiều triển khai

Tôi cũng không chắc chắn nơi deserialization nên cư trú.

+2

Bạn đã nhìn [Microsoft Web API] (http://www.asp.net/web-api)? –

+3

Bạn đang cố gắng đạt được điều gì, vào lúc này có vẻ như bạn đang chơi Pattern Bingo. –

Trả lời

11

Tôi nghĩ rằng sử dụng giao diện trong trường hợp này là phù hợp hơn:

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

Cách tiếp cận này cũng được gọi là Strategy Pattern

1

Xin vui lòng xem mã giả sử dụng Adapter Pattern và dependency injection. Idea là để tạo ra một giao diện và vượt qua nó xung quanh

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