2017-06-27 1 views
1

Existe-t-il un moyen simple et rapide avec AutoFac de détecter les exceptions de résolution de dépendance sans avoir à résoudre toute la hiérarchie des dépendances, ou résoudre rapidement la hiérarchie et détecter les problèmes?Autofac Invalid Configuration Prévention/Détection

Je connais la méthode AttachToComponentRegistration et je suis accro à la méthode de préparation, donc je peux voir exactement ce qui essaie d'être activé quand il échoue la résolution. Cependant, cela ralentit le processus de résolution car je consignation tous les appels. Le problème que j'essaye de résoudre spécifiquement est quand quelqu'un ajoute accidentellement quelque chose comme une chaîne à un constructeur, dans ce cas AutoFac échouera, mais ne vous dira pas la classe que son échec pour résoudre.

Exemple de message:

ne peut pas choisir entre plusieurs constructeurs ayant une longueur égale 1 sur le type 'System.String'

+0

Serait difficile d'avoir une telle fonctionnalité. Le service ayant un paramètre 'String' dans le constructeur sera résolu en ayant une dépendance' Func '. –

+1

Avec xUnit et [assertions autofac Fluent] (https://awesome-incremented.blogspot.ru/2016/01/fluently-testing-your-autofac.html) vous pouvez tester votre résolution de dépendance facilement. Les modules Autofac aident ici aussi à isoler/grouper les dépendances et à les tester en conséquence. –

+0

@AntonKrouglov Cela semble bien pour tester les dépendances individuelles, mais peut ne pas fonctionner aussi bien dans le cas de grands arbres de dépendances construits à partir d'autofac. – gmn

Répondre

0

Il ne ressemble pas à une solution vraiment sympa est actuellement possible Cependant, je suis arrivé avec une maison à mi-chemin qui stocke essentiellement toutes les demandes de résolution dans une liste statique que vous pouvez ajouter à AttachToComponentRegistration et l'accès lorsqu'une erreur est levée lors de la résolution des dépendances.

public static class AutoFacRequestLog 
{ 
    private static object syncer = new object(); 
    private static List<Type> RequestedTypes { get; set; } = new List<Type>(); 

    public static void AddRequest(Type type) 
    { 
     lock (syncer) 
      RequestedTypes.Add(type); 
    } 

    public static IEnumerable<Type> GetMostRecent(int i) 
    { 
     lock (syncer) 
      return RequestedTypes.Skip(Math.Max(0, RequestedTypes.Count - i)).Take(i); 
    } 
}