2 votes

Comment puis-je ajouter la journalisation à une classe statique sans perdre la capacité de tester unitairement?

REMARQUE : Je réalise que cette question est similaire à ce fil SO, mais je parle d'un cas spécifique ici, donc merci de ne pas fermer cette question comme un doublon de celui-ci.

J'essaie de rendre mon C# plus fonctionnel, et j'ai lu le livre Programmation fonctionnelle en C# d'Enrico Buonanno. Une des techniques qu'il montre est une classe Try, qui vous permet de gérer les exceptions de manière élégante. Vous pouvez voir le code de la classe Try ici.

C'est très astucieux, mais dans une application réelle, je voudrais enregistrer les exceptions. Comme sa classe est statique, je ne vois pas comment le faire. Comme expliqué dans le fil SO lié ci-dessus (entre autres), l'injection dans une classe statique ne peut pas être faite ou ce n'est pas une bonne idée.

Les seules options que je vois sont :

  1. Exiger du code consommateur de créer une instance de la classe Try (actuellement impossible avec son code), au lieu d'appeler la méthode statique. Cela rend le code beaucoup moins propre

  2. Ajouter une propriété statique ILogger à la classe Try, et la définir avant d'utiliser la classe. Je ne veux pas le faire, car la classe Try sera utilisée à la fois sur le client et sur le serveur dans mon application, et le logger serait différent dans les deux cas

  3. Ajouter un paramètre ILogger aux méthodes de la classe. Je n'aime pas ça pour les mêmes raisons que dans le cas 1.

  4. Accéder au résolveur de dépendances à l'intérieur de la classe try et obtenir une instance du logger. Cela signifierait que le code utilisant Try se retrouverait également à enregistrer dans le fichier, ce qui n'est pas une bonne idée.

Des suggestions ? L'approche semble si propre et élégante, mais semble aussi manquer d'une fonction de base évidente.

1voto

Avrohom Yisroel Points 551

Pourquoi ne pas avoir la méthode statique créer une instance de la classe, puis appeler une méthode d'instance privée qui fait le travail? Je ne suis pas familier avec Try, mais vous pourriez faire quelque chose comme ceci (attention - code aérien!)...

public class Try {
  // En supposant NInject, mais cela s'applique également à tout autre conteneur
  [Inject]
  ILogger Logger { get; set; }

  private Try() {
    // empêche quiconque en dehors de ce projet de créer une instance de Try
  }

  public static Exceptional Do(Action f) {
    Try t = new Try();
    return t.DoPrivate(f);
  }

  private Exceptional DoPrivate(Action f) {
    // Il s'agit d'une méthode d'instance, donc elle a accès au logger injecté
    try {
      return f();
    } catch (Exception ex) {
      Logger.Log(ex.Message);
      return ex;
    }
  }
}

Cela vous aide-t-il? Comme je l'ai dit, je ne suis pas familier avec son code, alors vous devrez peut-être l'adapter un peu, mais je pense que cela vous donnera ce que vous voulez.

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