Envelopper une API pour prendre en charge l’dependency injection

J’interagis avec une API qui ne contient que des fonctions statiques et qui ne peut pas être ouverte ni modifiée.

public class WindowsNativeGraphAPI { public static IEnumerable GetGraphData(); public static bool DeleteGraphData(IGraphData data); } 

J’aimerais pouvoir passer l’API dans une fonction ou un constructeur et respecter l’dependency injection (juste au cas où nous échangerions l’API plus tard).

 public void GatherGraphData(IGraphAPI api) {...} 

Pour permettre à cette API d’être transmise en tant que paramètre, il me faudrait au moins une méthode abstraite pour utiliser une interface à transmettre à la fonction.

  public interface IGraphAPI { IEnumerable GetGraphData(); bool DeleteGraphData(IGraphData data); } 

Cependant, il me faudrait alors implémenter l’interface dans une autre classe, car je ne peux pas modifier l’API d’origine. Cette classe serait un wrapper léger autour de l’API qui invoque simplement la fonction correspondante sur l’API et renvoie le même résultat.

  public class WindowsGraphAPI : IGraphAPI { public IEnumerable GetGraphData() { return WindowsNativeGraphAPI.GetGraphData(); } public bool DeleteGraphData(IGraphData data) { return WindowsNativeGraphAPI.DeleteGraphData(data) } } 

Je n’aime pas l’idée de créer une autre classe pour envelopper l’API. Je comprends que ce wrapper serait très léger et renverrait simplement les résultats de l’API, mais comment puis-je tester le wrapper? Le wrapper devrait probablement également contenir un traitement des exceptions pour gérer les erreurs dans l’API. Si nous devions passer à une autre API qui rencontrait le même problème, il nous faudrait recréer ces classes et interfaces supplémentaires.

Idéalement, le résultat final serait une API modulable pouvant être utilisée lors de l’écriture des tests unitaires du nouveau composant qui le consum.

Est-ce la bonne façon de faire cela? Peut-il être fait d’une autre manière?

Merci

Oui, c’est la bonne façon. La nouvelle interface API et la nouvelle classe de proxy encapsulent la décision de la bibliothèque sous-jacente à utiliser – une responsabilité unique.

Oui c’est la bonne façon. Je ne mettrais pas la gestion des exceptions dans votre wrapper, vous ne feriez que créer une classe qui appelle des méthodes statiques pour pouvoir utiliser DI. Vous souhaitez que l’encapsuleur provoque les mêmes exceptions dans les mêmes circonstances que la classe API avec les méthodes statiques. De cette façon, vous pouvez utiliser la même gestion des exceptions dans votre méthode que si vous étiez appelée la classe avec les méthodes statiques. Vous pouvez ensuite lancer les mêmes exceptions dans les mêmes circonstances dans votre classe d’api fictive et tester le traitement des excuses.