2010-09-22 5 views
5

Je vois des méthodes pour énumérer des listes de liaisons pour un service donné (type), mais je ne trouve nulle part une méthode retournant une liste de tout ce qui a été lié dans mes modules chargés. Je cherche quelque chose comme Kernel::IEnumerable<IBinding> GetAllRegisteredBindings()Comment lister tous les IBindings enregistrés dans Ninject?

Est-ce que cela existe? Sinon, pourrais-je être capable de construire une extension qui pourrait le faire? Je devrais être en mesure d'obtenir les liaisons sans un type de service ...

+0

Pouvez-vous expliquer pourquoi vous le voulez, wat que vous allez faire quand nous vous dire comment: P –

Répondre

2

J'ai regardé le code et je n'ai pas vu un moyen de demander toutes les liaisons. Si vous êtes à l'aise avec la modification et en utilisant le code modifié, voici ce que vous pouvez faire:

à IKernel.cs, ajouter:

/// <summary> 
    /// Gets all registered bindings 
    /// </summary> 
    IEnumerable<IBinding> GetBindings(); 

à KernelBase.cs, ajouter:

/// <summary> 
    /// Gets all registered bindings 
    /// </summary> 
    public virtual IEnumerable<IBinding> GetBindings() 
    { 
     return _bindings.SelectMany(kvp => kvp.Value); 
    } 

et recompiler.

à utiliser:

var bindings = Kernel.GetBindings(); 
    bindings.ForEach(b => logger.DebugFormat("Binding: {0} -> {1}", b.Service, b.Target)); 
1

Alors que thieben isnt @ Dave tort, il semble que votre itinéraire en sans exiger forkage peut être d'enregistrer une coutume IBindingResolver composant dans le noyau, puis concocter un IRequest qu'il reconnaîtra, éventuellement par l'intermédiaire ResolutionExtensions.GetAll() (en général, la plupart vous demandera de spécifier un service (si aucune Ensure.NotNull là-dessus, certains vont partie sur elle en supposant NotNull).

Mais vous avez oublié de dire pourquoi vous le voulez.

Ainsi, je recommande:

  1. dire ce que vous voulez
  2. sur la liste demandent de diffusion ninject, y compris la réponse à # 1 - c'est pas question de débutant!
+0

ooh, c'est cool. Je n'avais pas considéré cela. –

+1

Thx Dave; thx Ruben. Désolé pour le retard, je n'ai pas "Notify" cochée. C'était à l'origine pour le purpsose de fournir un point d'entrée singulier dans un cadre, c'est-à-dire une classe FrameworkServices qui fournirait une liste des descendants IFrameworkService qui avaient été liés; ainsi, le code d'appel pourrait vérifier avec le gestionnaire quelles liaisons de service étaient disponibles ... Depuis, j'ai suivi un chemin différent, bien que j'aimerais quand même pouvoir obtenir une liste de toutes les liaisons. ;-) –

+0

@Robert Leahey: Il y a un bon nombre d'appels qui font ce que vous voulez (trouver les bindigns pour un service spécifique). La façon dont vous l'avez demandé a suggéré que vous vouliez toutes les liaisons pour tous les services, ce qui est difficile . Il y a des appels pour obtenir des liaisons et il y a des appels pour obtenir IEnumerable ou des tableaux d'implémentations d'un service. Il existe également un ensemble d'API pour mettre des métadonnées sur des liaisons afin de faciliter la sélection par programmation d'une appropriée à l'instant de résolution, soit impérativement, soit de manière déclarative. –

1

j'ai pu utiliser la réflexion pour ce faire:

KernelBase baseKernel = (KernelBase)Kernel; 

// _commandCollection is an instance, private member 
BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic; 

// Retrieve a FieldInfo instance corresponding to the field 
FieldInfo field = typeof(KernelBase).GetField("bindings", flags); 

Multimap<Type, IBinding> bindingsMap = (Multimap<Type, IBinding>)field.GetValue(baseKernel); 

bindingsMap.SelectMany(x => x.Value).ToList().ForEach(x => log.DebugFormat("Binding: {0} -> {1}", x.Service, x.Target)); 
+0

Est-ce que cela a vraiment fait l'affaire pour vous? Je l'ai essayé avec la dernière version de Ninject, et pour mes propres liaisons, 'x.Target' affiche simplement' Type'. Les valeurs de la cible de liaison interne de Ninject étaient l'une des suivantes: {'Constant',' Method', 'Self',' Type', 'Provider'}. Je n'ai trouvé aucune méthode sur 'x.Target' à utiliser pour obtenir le nom de la cible réelle (' x.Target.GetType(). Name' ne m'a rien donné d'utile) – Jeff

+0

Non je pense que j'avais le même problème en fait. Je n'ai jamais trouvé un excellent moyen d'afficher cette information. –

Questions connexes