7 votes

Modèle de conception pour la création d'une URL d'API

Je suis en train de créer une bibliothèque de classes qui interagit avec diverses API de tierces parties. J'ai utilisé un modèle de façade pour fournir un accès simplifié à des appels compliqués et déroutants, et un modèle de fabrique pour renvoyer l'implémentation correcte. J'essaie maintenant de construire l'une des implémentations, mais je n'arrive pas à trouver un design élégant.

L'implémentation que je suis en train de réaliser nécessite la construction d'une URL (ce que je fais via URIBuilder). Je dois ensuite "exécuter" l'URL. Je désérialise ensuite le résultat Xml dans une classe.

Je prévois d'utiliser HttpClient pour appeler l'API avec l'URI que j'ai construit, mais je ne suis pas sûr de la façon de structurer la classe. Les options auxquelles j'ai pensé sont les suivantes :

  1. Une classe de base de mon implémentation afin de pouvoir l'appeler via base.InvokeURI(Uri myUri) .

  2. Une classe de séparation pour qu'elle puisse être utilisée par plusieurs implémentations.

Je ne sais pas non plus où doit se trouver la désérialisation.

12voto

namkha87 Points 4308

Je pense que l'utilisation d'Interface dans ce cas est plus appropriée :

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

Cette approche est également appelée Modèle de stratégie

2voto

Ajay Beniwal Points 7637

Veuillez voir le code fictif utilisant le modèle d'adaptateur et l'injection de dépendance. L'idée est de créer une interface et de la faire circuler.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X