7

我正在构建一个与各种 3rd 方 API 交互的类库。我使用了外观模式来提供对复杂和令人困惑的调用的简化访问,并使用工厂模式来返回正确的实现。我现在正在尝试构建一个实现,但想不出一个优雅的设计。

我正在构建的实现需要构建一个 URL(我正在通过 URIBuilder 进行)。然后我需要“执行”该网址。然后我将 Xml 结果反序列化为一个类。

我计划使用 HttpClient 使用我构建的 URI 调用 api,但不确定如何构建类。我想到的选项是:

  1. 我的实现的基类,因此可以通过base.InvokeURI(Uri myUri).

  2. 一个分离类,因此它可以被多个实现使用

我也不确定反序列化应该放在哪里。

4

2 回答 2

12

我认为在这种情况下使用 Interface 更合适:

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 回答