C# 用于创建API URL的设计模式

C# 用于创建API URL的设计模式,c#,asp.net-mvc,design-patterns,C#,Asp.net Mvc,Design Patterns,我正在构建一个与各种第三方API交互的类库。我使用了facade模式来提供对复杂和混乱调用的简化访问,并使用factory模式来返回正确的实现。我现在正试图构建一个实现,但想不出一个优雅的设计 我正在构建的实现需要构建一个URL(我正在通过URIBuilder进行构建)。然后我需要“执行”url。然后,我将Xml结果反序列化为一个类 我计划使用HttpClient调用带有我构建的URI的api,但不确定如何构造类。我想到的选择是: 我的实现的基类,因此可以通过base.InvokeURI(uri

我正在构建一个与各种第三方API交互的类库。我使用了facade模式来提供对复杂和混乱调用的简化访问,并使用factory模式来返回正确的实现。我现在正试图构建一个实现,但想不出一个优雅的设计

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

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

  • 我的实现的基类,因此可以通过
    base.InvokeURI(urimyuri)
    调用它

  • 一个单独的类,因此可以由多个实现使用


  • 我也不确定反序列化应该驻留在哪里

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

    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);
    
    这种方法也被称为

    请参阅使用适配器模式和依赖项注入的伪代码。 其想法是创建一个接口并将其传递

    公共类适配器{
    public void processRequest(){
    RequestProcessor处理器=新的RequestProcessor();
    processRequest();
    }
    }
    公共类请求处理器{
    公共无效过程请求(){
    Irequest请求=新的HTTPRequest();
    HTTPService=新的HTTPService();
    //从生成器类获取uri
    URI url=URIBUIlder();
    字符串响应=service.sendRequest(请求,url);
    //现在从刚才的
    类型t=序列化程序.searialize(响应);
    }
    }
    公共类序列化程序{
    公共静态T searialize(字符串xml){
    }
    }
    公共接口IRequest{
    公共字符串sendRequest(uri url);
    }
    公共类HTTPRequest:IRequest{
    公共字符串sendRequest(uri url){
    //在此处实例化实际http请求并返回响应
    }
    }
    //这将充当控制器
    公共类HTTPService{
    公共字符串sendRequest(IRequest请求,uri url){
    返回请求。发送请求(url);
    }
    }
    
    你看了吗?你想达到什么目的,现在看起来你在玩模式宾果游戏。
    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);
     }
    }