2017-07-04 2 views
1

Je commence actuellement à développer une compétence Alexa en C#. Comme je ne voulais pas avoir un désordre si bloquer la vérification du type d'intention d'une demande entrante j'ai eu l'idée suivante: Écriture d'une classe statique RequestHandler qui stocke une liste de toutes les intentions possibles (Liste des IIntent interface qui sera être implémenté par des classes qui représentent une intention).Auto-inscription Classes

Je sais avoir le problème de conception, que je ne sais pas quelle pourrait être la meilleure façon d'enregistrer ces intentions. Ma première idée était d'écrire simplement

internal static void RegisterIntent(IIntent intent) => Intents.Add(intent); 

et l'appeler dans les constructeurs statiques de chaque intention. À ce stade, je ne savais pas que les constructeurs statiques seulement seront exécutés la première fois que la classe sera accessible. Donc, cette idée ne fonctionne pas comme je le pensais. Les autres idées que je pour savoir peux penser, sont les suivants:

  • l'ajout d'une méthode statique Initialiser/Inscrivez-vous pour chaque classe intention dans laquelle il crée une instance qui sera ajouté dans la liste intention statique -> cette volonté résultat dans beaucoup de méthodes initiliaze que je devrais ajouter manuellement à la fonction lambda exécutée.
  • Ajout d'une méthode Initialize au RequestHandler statique qui ajoutera une instance de chaque classe d'intention à la liste statique -> Je devrais toujours écrire manuellement la commande RegisterIntent (new ABCIntent()) pour chaque classe d'intention.

Y at-il un moyen d'obtenir toutes les classes intention d'ajouter dans la liste statique sans ajout de code pour cette action de registre manuellement? Ou y a-t-il de meilleurs moyens d'y parvenir que ces deux-là? Peut-être avec la réflexion (tbh: je suis tout à fait nouveau au développement de lamda d'AWS et je ne sais pas si cela fonctionnera).

+3

Vous devriez vous intéresser aux frameworks d'injection de dépendances tels que StructureMap, AutoFac, Unity, etc. car ils sont construits pour des situations comme celle-ci. Si par exemple tous vos intentions implémente une certaine interface comme IIntent et que toutes les implémentations concrètes d'intentions implémentent cette interface, le framework d'injection de dépendance peut les enregistrer automatiquement et vous en donner une liste. –

+0

Merci pour cette idée. Mais j'ai l'impression que l'utilisation d'un framework complet est un peu trop pour moi en ce moment car je ne fais qu'expérimenter avec Alexa. – Serraniel

Répondre

0

J'ai pendant ce temps changé l'enregistrement en utilisant la réflexion. Je peux donc rechercher toutes les classes implémentant l'interface IIntent dans le constructeur statique du gestionnaire de requêtes.

static RequestHandler() 
    { 
     var assembly = typeof(RequestHandler).GetTypeInfo().Assembly; 

     foreach (var t in assembly.GetTypes()) 
     { 
      if (t.GetInterfaces().Contains(typeof(IIntent))) 
      { 
       Intents.Add(Activator.CreateInstance(t) as IIntent); 
      } 
     } 
    } 

Ou y at-il de meilleures propositions?